您的位置:首页 > 其它

【LeetCode】Permutations II

2014-09-07 21:22 381 查看
Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,

[1,1,2]
have the following unique permutations:

[1,1,2]
,
[1,2,1]
,
and
[2,1,1]
.
思路:跟之前的Permutations思路基本一样,用一个数组来记录是否可用,同时这个地方要注意的是由于数组有一样的情况,所以要将不同的数字填入然后才进行操作。每次取出一个不同的数,然后利用剩下的数形成子集。
class Solution {
public:
vector<vector<int>> res;

vector<vector<int>> permuteUnique(vector<int> &num) {
vector<bool> avail(num.size(),true);
vector<int> tmp;
sort(num.begin(), num.end());
permuteUniqueRe(num,avail,tmp);
return res;
}
void permuteUniqueRe(vector<int> &num, vector<bool> &avail, vector<int> &pos){
if(pos.size() == num.size()){
res.push_back(pos);
return;
}
int last_index = -1;
//从开始遍历将没有填入的依次填入
for(int i=0;i<num.size();i++){
if (!avail[i]) continue;
if (last_index != -1 && num[i] == num[last_index]) continue;

//填入并标记不可用
avail[i] = false;
pos.push_back(num[i]);
//继续进行操作
permuteUniqueRe(num,avail,pos);
//当操作完成以后要将之前填入的退出来
pos.pop_back();
avail[i] = true;
last_index = i;

}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: