Permutations,Permutations II,Combinations
这是使用DFS来解数组类题的典型题目,像求子集,和为sum的k个数也是一个类型
解题步骤:
1:有哪些起点,例如,数组中的每个元素都有可能作为起点,那么用个for循环就可以了。
2:是否允许重复组合
3:处理某个数,判断结果
4:dfs递归
5:还原现场
一:Permutations
Given a collection of numbers, return all possible permutations.
For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].
代码:
class Solution {
void dfs(vector<int>& nums,int start,vector<vector<int>>& res,vector<int>& oneRes){
int n = nums.size();
if(start == n){
res.push_back(oneRes);
}
for(int i= start;i<nums.size();++i){
if(i>start && nums[i]==nums[i-]){
continue;
}
oneRes.push_back(nums[i]);
swap(nums[i],nums[start]);
dfs(nums,start+,res,oneRes);
swap(nums[i],nums[start]);
oneRes.pop_back();
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> oneRes;
dfs(nums,,res,oneRes);
return res;
}
};
二:Permutations II
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].
方法1.
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
vector<int> tmp(nums);
sort(tmp.begin(),tmp.end());
res.push_back(tmp);
while(next_permutation(tmp.begin(),tmp.end())){
res.push_back(tmp);
}
return res;
}
};
方法2.
class Solution {
void dfs(vector<int>& nums,int start,vector<vector<int>>& res,vector<int>& oneRes){
int n = nums.size();
if(start == n){
res.push_back(oneRes);
}
for(int i= start;i<nums.size();++i){
if(i>start && nums[i]==nums[i-]){
continue;
}
int selectNum = nums[i];
oneRes.push_back(selectNum);
copy_backward(nums.begin()+start,nums.begin()+i,nums.begin()+i+);
nums[start] = selectNum;
dfs(nums,start+,res,oneRes);
copy(nums.begin()+start+,nums.begin()+i+,nums.begin()+start);
nums[i] = selectNum;
oneRes.pop_back();
}
}
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
vector<int> oneRes;
sort(nums.begin(),nums.end());
dfs(nums,,res,oneRes);
return res;
}
};
方法3.
class Solution {
public:
void dfs(vector<int> nums,int numsSize,int startPos,vector<vector<int>>& res,vector<int>& oneOfRes)
{
sort(nums.begin()+startPos,nums.end());
for(int i=startPos;i<numsSize;i++){
if(i>startPos && nums[i]==nums[i-]){
continue;
}
oneOfRes.push_back(nums[i]);
swap(nums[i],nums[startPos]);
if(oneOfRes.size()==numsSize){
res.push_back(oneOfRes);
}else{
dfs(nums,numsSize,startPos+,res,oneOfRes);
}
swap(nums[i],nums[startPos]);
oneOfRes.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
// sort(nums.begin(),nums.end());
vector<vector<int>> res;
vector<int> oneOfRes;
int numsSize = nums.size();
dfs(nums,numsSize,,res,oneOfRes);
return res;
}
};
77. Combinations
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.
For example,
If n = 4 and k = 2, a solution is:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
class Solution {
void dfs(int n,int start,int k,int curk,vector<vector<int>>& res,vector<int>& oneRes){
if(curk == ){
res.push_back(oneRes);
return;
}
for(int i=start;i<=n;++i){
oneRes.push_back(i);
dfs(n,i+,k,curk-,res,oneRes);
oneRes.pop_back();
}
}
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
vector<int> oneRes;
dfs(n,,k,k,res,oneRes);
return res;
}
};
Permutations,Permutations II,Combinations的更多相关文章
- LeetCode:Permutations, Permutations II(求全排列)
Permutations Given a collection of numbers, return all possible permutations. For example, [1,2,3] h ...
- leetcode总结:permutations, permutations II, next permutation, permutation sequence
Next Permutation: Implement next permutation, which rearranges numbers into the lexicographically ne ...
- LeetCode46,47 Permutations, Permutations II
题目: LeetCode46 I Given a collection of distinct numbers, return all possible permutations. (Medium) ...
- LeetCode解题报告—— Permutations & Permutations II & Rotate Image
1. Permutations Given a collection of distinct numbers, return all possible permutations. For exampl ...
- Permutations I&&II
Permutations I Given a collection of distinct numbers, return all possible permutations. For example ...
- Combination Sum II Combinations
https://leetcode.com/problems/combination-sum-ii/ 题目跟前面几道题很类似,直接写代码: class Solution { public: vector ...
- leetcode difficulty and frequency distribution chart
Here is a difficulty and frequency distribution chart for each problem (which I got from the Interne ...
- Leetcode——回溯法常考算法整理
Leetcode--回溯法常考算法整理 Preface Leetcode--回溯法常考算法整理 Definition Why & When to Use Backtrakcing How to ...
- Python标准模块--itertools
1 模块简介 Python提供了itertools模块,可以创建属于自己的迭代器.itertools提供的工具快速并且节约内存.开发者可以使用这些工具创建属于自己特定的迭代器,这些特定的迭代器可以用于 ...
随机推荐
- android——拍照,相册图片剪切其实就这么简单
接触android这么久了.还没有真正的浩浩看看android拍照,相册图片剪切到底是怎么回事,每次都是从别人的代码一扣,就过来了.其实,谷歌提供的API已经很强大.只需要用的好,就那么几句就可以搞定 ...
- C# 关于out关键字的用法(一个方法返回多个值的问题)
通常一个方法只能返回一个值,但是如果在某些时候,我们想要返回多个值,例如某个方法将一个浮点数分割成一个整数和一个小数返回去.这个时候我们就要用到out关键字. 如果用ref也可以解决,但是用ref需要 ...
- DevExpress中SearchLookUpEdit用法总结
在前一个项目中用到了DevExpress,需要搜索某一个字段,来拉取出对应的相关信息,比来比去,发现SearchLookUpEdit的用户体验更好,但自己是个不折不扣的C#和DevExpress的初学 ...
- IRP 与 派遣函数
什么是派遣函数: 派遣函数是 WIndows 驱动程序中的重要概念.驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的.也就是说,派遣函数是用来处理驱动程序提交过来的 I ...
- vim自动补全文章搜集
引用文章A:http://blog.csdn.net/wendy260310/article/details/18035555 文章介绍:添加C++标准库的tags文件方法.(中文版) 引用文章B:h ...
- jquery操作session的方法
jquery.session.js使用 //此方法在java中不能使用 // jquery.session.js 简单使用方法 添加数据 $.session.set('key', 'value ...
- HttpWebRequest在GetResponse时总是超时
最近在通过RESTFUL接口来发布些数据,总是出现请求超时,好不容易找到个靠谱点的了,记下来,回去试下!! “ 问题就是我第一个HttpWebRequest在GetResponse之后,忘记将取得的W ...
- iphone iOS7恢复到iOS6教程
步骤一:首先根据您iOS设备型号,下载最新的iOS 6固件,您可以进入苹果官网下载,也可以以下网址下载. http://sj.zol.com.cn/ios613/
- Leetcode 283 Move Zeroes python
题目: Given an array nums, write a function to move all 0's to the end of it while maintaining the rel ...
- Python中各种集合 list tuple set dict
list 创建list L = ['Adam','Lucy','Bart'] 索引访问: 正序(和数组类似) L[0],L[1],L[2] 倒序 L[-1]倒数第一个 L[- ...