题解 | #集合的所有子集(二)#

集合的所有子集(二)

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;
    }
};
全部评论

相关推荐

努力成为C语言高手:质疑大祥老师,理解大祥老师,成为大祥老师
点赞 评论 收藏
分享
11-11 14:21
西京学院 C++
Java抽象练习生:教育背景放最前面,不要耍小聪明
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务