问题
思路
上一目的题目需要两个条件:
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);
}
}
}
};