1. 程式人生 > >LeetCode 90. 子集 II(Subsets II)

LeetCode 90. 子集 II(Subsets II)

輸出 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)