您的位置:首页 > 其它

leetcode Permutations II

2014-06-13 22:26 459 查看
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]
.
采用回溯法,因为当前的元素如果在本次没有被选中,需要在以后被选中。所以这里并不是单纯地将num[i],加入到aresult中。而是swap(num[i],num[left]),然后aresult中加入num[left],之后回溯;

当我们枚举第i个位置的元素时,若要把后面第j个元素和i交换,则先要保证[i…j-1]范围内没有和位置j相同的元素。

class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(),num.end());
vector<vector<int>> result;
vector<int> aresult;
sub(result,aresult,num,0);
return result;
}
void sub(vector<vector<int>> &result,vector<int> &aresult,vector<int>&num,int left){
if(left>num.size()) return;
if(left==num.size()){
result.push_back(aresult);
return;
}
for(int i=left;i<num.size();i++){
if(i == left || !find(num, left, i, num[i])){
swap(num[left],num[i]);
aresult.push_back(num[left]);
sub(result,aresult,num,left+1);
aresult.pop_back();
swap(num[left],num[i]);
}
}
}
bool find(vector<int> &num, int start, int end, int target)
{
for(int i = start; i < end; i++)
if(num[i] == target)
return true;
return false;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: