leetcode-90-Subsets II

来源:互联网 发布:程序员简历怎么写 编辑:程序博客网 时间:2024/06/04 23:35

问题

题目:[leetcode-90]

思路

上一目的题目需要两个条件:
1.必须是升序
2.试探过的元素不能反复试探
3. 如果是相同的元素,同一个位置不能由多个相同元素试探。但是要注意,如果相同元素已经试探了别的位置,那么这个位置不可能由相同元素试探。即使元素相同。

代码

class Solution {public:    vector<vector<int>> subsetsWithDup(vector<int>& nums) {        vector<int> arr;        vector<vector<int>> ret;        ret.push_back(arr);        set<int> visited;        dfs( arr, visited, nums, nums.size(), ret );        return ret;    }private:    void dfs(vector<int>& arr, set<int>& visited, vector<int>& nums, int n, vector<vector<int>>& ret ){        if( arr.size() == n ) return;        else{            for(int i = 0; i < n; ++i){                if( visited.find(i) != visited.end() ) continue;                int sz = arr.size();                bool flag = true;                for( int k = 0; k < sz; ++k ){                    if( arr[k] > nums[i] ){ flag = false; break; }                }                if(!flag) continue;                flag = true;                for(int j = 0; j < i; ++j){                    if(nums[j] == nums[i] && visited.find(j) == visited.end() ){ flag = false; break; }                }                if(!flag) continue;                arr.push_back( nums[i] );                visited.insert( i );                ret.push_back(arr);                dfs( arr, visited, nums, n, ret );                arr.pop_back();                visited.erase(i);            }        }    }};