Given a collection of integers that might contain duplicates, nums, return all possible subsets. Note: The solution set must not contain duplicate subsets. For example, If nums = [1,2,2], a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]解题思路:寻找数组中不重复的所有子集;可立即反应用深度搜索,通关条件判断除去重复项,dps基本框架为:
void dfs(&nums, start, sub, &res) { if(condition) return; else res.push_back(sub); for(int i = start; i < nums.size(); i++) { sub.push_back(nums[i]); dfs(nums, i + 1, sub, res); sub.pop_back(); } return; }思考通过改变判断条件即可实现输出不重复子集:
void dfs(vector<int>& nums, int start, vector<int> sub, vector<vector<int>>& res){ res.push_back(sub); for(int i = start; i < nums.size(); i++){ if(i!=start && nums[i] == nums[i-1]) continue; sub.push_back(nums[i]); dfs(nums, i+1, sub, res); sub.pop_back(); } return; } vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<vector<int>> res; vector<int> sub; sort(nums.begin(), nums.end()); dfs(nums, 0, sub, res); return res; }