题解 | #集合的所有子集(二)#
集合的所有子集(二)
http://www.nowcoder.com/practice/a3dfd4bc8ae74fad9bc65d5ced7ae813
递归 + 回溯 + 访问标记
举例说明,对于数组[1,2,2],将其标记为[1,2,2']。
排序后,对于相邻的相等元素:
- 如果我们访问了2,再访问2'; 将子集[2, 2']加入结果。继续。
- 如果我们访问了2',却还没有访问2,我们是不希望有这种情况的,得跳过。
class Solution {
public:
vector<vector<int>> res;
vector<int> tmp;
bitset<10> visited;
void backTrace(vector<int>& nums, int start){
res.push_back(tmp);
for(size_t i = start; i < nums.size(); i++){
if(i > 0 && nums[i] == nums[i-1] && !visited[i-1]) continue;
tmp.push_back(nums[i]);
visited[i] = 1;
backTrace(nums, i + 1);
tmp.pop_back();
visited[i] = 0;
}
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型vector<vector<>>
*/
vector<vector<int> > subsets(vector<int>& nums) {
// write code here
if(nums.empty()) return res;
sort(nums.begin(), nums.end());
backTrace(nums, 0);
return res;
}
};