1. 程式人生 > >【Leetcode】78. Subsets(求集合的子集問題)

【Leetcode】78. Subsets(求集合的子集問題)

構造 alt soft vat 題目 www. ack tco sub

78. Subsets(求集合的子集問題)

【分析】:求集合的所有子集問題。題目要求子集中元素非遞減序排列,因此我們先要對原來的集合進行排序。原集合中每一個元素在子集中有兩種狀態:要麽存在、要麽不存在。這樣構造子集的過程中每個元素就有兩種選擇方法:選擇、不選擇,因此可以構造一顆二叉樹,例如對於例子中給的集合[1,2,3],構造的二叉樹如下(左子樹表示選擇該層處理的元素,右子樹不選擇),最後得到的葉子節點就是子集:{ 鏈接 }

技術分享圖片

 1 class Solution
 2 {
 3 private:
 4     vector<vector<int>> rets;
5 public: 6 vector<vector<int>> subsets(vector<int>& nums) 7 { 8 sort(nums.begin(), nums.end()); 9 vector<int> yhs; 10 DFS(0, nums, yhs); 11 return rets; 12 } 13 14 void DFS(int end, vector<int> &nums, vector<int
> &yhs) 15 { 16 if(end == nums.size()) 17 { 18 ret.push_back(yhs); 19 return; 20 } 21 yhs.push_back(nums[end]); 22 DFS(end + 1, nums, yhs); 23 yhs.pop_back(); 24 DFS(end + 1, nums, yhs); 25 } 26
};

【Leetcode】78. Subsets(求集合的子集問題)