LeetCode 90. 子集 II(Subsets II)
阿新 • • 發佈:2018-08-20
輸出 with 示例 子集 emp () ack public 一起
題目描述
給定一個可能包含重復元素的整數數組 nums,返回該數組所有可能的子集(冪集)。
說明:解集不能包含重復的子集。
示例:
輸入: [1,2,2]
輸出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
解題思路
利用回溯的思想,對於每個元素分為兩種情況:不添加到子集或者添加到子集。註意因為有重復元素,所以先對整個數組排序使得重復元素到一起,若遇到重復元素,則單獨處理,針對每種可能的組合情況添加或不添加到子集中。
代碼
1 class Solution { 2 public: 3 vector<vector<int>> subsetsWithDup(vector<int>& nums) { 4 vector<vector<int>> res; 5 vector<int> temp; 6 sort(nums.begin(), nums.end()); 7 subsets(nums, 0, temp, res); 8 return res; 9 } 10 void subsets(vector<int> nums, int idx, vector<int> temp, vector<vector<int>> &res){ 11 if(idx == nums.size()){ 12 res.push_back(temp); 13 return; 14 } 15 if(idx < nums.size() - 1 && nums[idx] == nums[idx + 1]){ 16 int i = idx; 17 while(i < nums.size() - 1&& nums[i] == nums[i + 1]) i++; 18 while(idx <= i){ 19 subsets(nums, i + 1, temp, res); 20 temp.push_back(nums[idx++]); 21 } 22 subsets(nums, i + 1, temp, res); 23 } 24 else{ 25 subsets(nums, idx + 1, temp, res); 26 temp.push_back(nums[idx]); 27 subsets(nums, idx + 1, temp, res); 28 } 29 } 30 };
LeetCode 90. 子集 II(Subsets II)