您的位置:首页 > 其它

给定不同数字的集合,返回所有可能的排列。

2017-12-15 09:26 405 查看
本题源自leetcode   46

---------------------------------------------------------------------------

思路:回溯法

1 对数组排序,2定义回溯函数   3   定义递归结束条件,即起始位置大于等于数组大小。 4 每次交换俩个数,递归后在交换回来,保证下次递归。

代码

vector<vector<int>> permute(vector<int>& nums)  {
vector<vector<int>> res;
int n = nums.size();
if(n == 0)
return res;
sort(nums.begin(),nums.end());
backPath(nums,res,0);
return res;
}
void backPath(vector<int>& nums,vector<vector<int>>& res,int start){
if(nums.size() <= start){
res.push_back(nums);
return;
}
for(int i = start; i < nums.size(); i++){
swap(nums[start],nums[i]);
backPath(nums,res,start + 1);
swap(nums[start],nums[i]);
}
}

2 给定可能包含重复的数字的集合,返回所有可能的唯一排列。

去重复,只交换一次

代码:

void recursion(vector<int> num, int start, vector<vector<int> > &res) {
if (start == num.size()) {
res.push_back(num);
return;
}
for (int k = start; k < num.size(); k++) {
if (start != k && num[start] == num[k])
continue;
swap(num[start], num[k]);
recursion(num, start+1, res);
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(), num.end());
vector<vector<int> >res;
recursion(num, 0, res);
return res;
}

思路2
void recursion(vector<int> nums, int start, vector<vector<int> > &res) {
if (start == nums.size()) {
res.push_back(nums);
return;
}
unordered_set<int> mp;
for (int k = start; k < nums.size(); k++) {
if(mp.count(nums[k]) > 0)
continue;
mp.insert(nums[k]);
swap(nums[start], nums[k]);
recursion(nums, start+1, res);
swap(nums[start], nums[k]);
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(), num.end());
vector<vector<int> >res;
recursion(num, 0, res);
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐