给定不同数字的集合,返回所有可能的排列。
2017-12-15 09:26
405 查看
本题源自leetcode 46
---------------------------------------------------------------------------
思路:回溯法
1 对数组排序,2定义回溯函数 3 定义递归结束条件,即起始位置大于等于数组大小。 4 每次交换俩个数,递归后在交换回来,保证下次递归。
代码
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;
}
---------------------------------------------------------------------------
思路:回溯法
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;
}
相关文章推荐
- 给定可能包含重复的数字的集合,返回所有可能的唯一排列。
- 给定一个数字列表,返回其所有可能的排列。 注意事项 你可以假设没有重复数字。
- 给定一组不同的整数,S返回所有可能的子集。
- 给定一个数字字符串,返回数字可能表示的所有可能的字母组合。数字与字母的对应关系和手机按键对应。
- 给定一个数字字符串,返回数字可能表示的所有可能的字母组合。数字与字母的对应关系和手机按键对应
- java求子集和,给定数组求这个数组中某些数字相加等于某个值的所有可能集合
- 给定一串数字和运算符,返回所有可能的结果,有效的运算符是+, - 和*。
- 给定一个可能包含重复的整数的集合,S返回所有可能的子集。
- 用 1,2,2,3,4,5 六个数字,打印出所有不同的排列,要求:"4"不能在第三位,"3"与"5"不能相连
- 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代
- 给定一个数字m和数字n,输出相应的所有排列
- 面试题─用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列
- 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
- 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列, 如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连.
- 利用1、2、2、3、4这5个数字,打印出所有不同的排列,不能有重复
- 【动态规划】扔 n 个骰子,向上面的数字之和为 S。给定 Given n,请列出所有可能的 S 值及其相应的概率。
- 给定n个数{1,2,3,...,n},从中选择任意两两不同的k个数,输出所有可能的组合
- 小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推知道全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数) 给定四个整数A,B,C,D,请返回所求结果。
- // 40、用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列, // 如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连.
- 给定候选号码(C)和目标号码(T)的集合,找出C中候选号码总和为T的所有唯一组合 C中的每个数字只能在组合中使用一次。