Permutations
2016-07-16 19:48
302 查看
Given a collection of distinct numbers, return all possible permutations.
For example,
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > res;
// vector<int> tmp;
// dfs(res,tmp,nums,0);
dfs(res,nums,0);
return res;
}
void dfs(vector<vector<int>> &res,vector<int>&nums,int pos)
{
if(pos==nums.size())
{
res.push_back(nums);
return;
}
for(int i=pos;i<nums.size();i++)
{
swap(nums[pos],nums[i]);
dfs(res,nums,pos+1);
//这里要pos+1,不是i+1.pos表示排列第几个元素。
swap(nums[pos],nums[i]);
}
}
};
pos是下一层位置
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > res;//res相当与result;
vector<int> tmp;
int len=nums.size();
vector<bool> visit(len,false);
sort(nums.begin(),nums.end());
dfs(res,tmp,nums,visit);
return res;
}
void dfs(vector<vector<int>> &res,vector<int> &tmp,vector<int> &nums,vector<bool>& visit)
{
if(nums.size()==tmp.size())
{
res.push_back(tmp);
return;
}
for(int i=0;i<nums.size();i++)
{
if(!visit[i])
{
tmp.push_back(nums[i]);
visit[i]=true;
dfs(res,tmp,nums,visit);
tmp.pop_back();
visit[i]=false;
}
}
}
};
参考:http://blog.csdn.net/u011095253/article/details/9158403
这次,我们要生成完整的序列了,那么和上次的Subset有什么不同呢?
1. 添加进res的时间,上面题我们每添加一个数字到tmp里,就可以往res里面添加,而这次,我们要生成完整的序列,所以需要当tmp.size()==序列长度的时候再往res里面添加
2. 每次不能从pos开始往数组尾巴扫了,因为我们要求的不是Subset而是完整序列,所以要从第一个数字开始往数组尾巴扫,问题又来了,我们怎么知道取没取过这个元素呢,那么我们就创建一个boolean[] visit 每此添加的时候给相对应位置置True,删去的时候置False
几点注意的地方:
1. 每次判断是否visit的时候,这个if语句应该概括for循环里所有的动作,因为这么想,如果visit过,我们什么事也不做,直接跳过
2. 给res添加完之后,别忘了return
For example,
[1,2,3]have the following permutations:
[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > res;
// vector<int> tmp;
// dfs(res,tmp,nums,0);
dfs(res,nums,0);
return res;
}
void dfs(vector<vector<int>> &res,vector<int>&nums,int pos)
{
if(pos==nums.size())
{
res.push_back(nums);
return;
}
for(int i=pos;i<nums.size();i++)
{
swap(nums[pos],nums[i]);
dfs(res,nums,pos+1);
//这里要pos+1,不是i+1.pos表示排列第几个元素。
swap(nums[pos],nums[i]);
}
}
};
pos是下一层位置
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > res;//res相当与result;
vector<int> tmp;
int len=nums.size();
vector<bool> visit(len,false);
sort(nums.begin(),nums.end());
dfs(res,tmp,nums,visit);
return res;
}
void dfs(vector<vector<int>> &res,vector<int> &tmp,vector<int> &nums,vector<bool>& visit)
{
if(nums.size()==tmp.size())
{
res.push_back(tmp);
return;
}
for(int i=0;i<nums.size();i++)
{
if(!visit[i])
{
tmp.push_back(nums[i]);
visit[i]=true;
dfs(res,tmp,nums,visit);
tmp.pop_back();
visit[i]=false;
}
}
}
};
参考:http://blog.csdn.net/u011095253/article/details/9158403
这次,我们要生成完整的序列了,那么和上次的Subset有什么不同呢?
1. 添加进res的时间,上面题我们每添加一个数字到tmp里,就可以往res里面添加,而这次,我们要生成完整的序列,所以需要当tmp.size()==序列长度的时候再往res里面添加
2. 每次不能从pos开始往数组尾巴扫了,因为我们要求的不是Subset而是完整序列,所以要从第一个数字开始往数组尾巴扫,问题又来了,我们怎么知道取没取过这个元素呢,那么我们就创建一个boolean[] visit 每此添加的时候给相对应位置置True,删去的时候置False
几点注意的地方:
1. 每次判断是否visit的时候,这个if语句应该概括for循环里所有的动作,因为这么想,如果visit过,我们什么事也不做,直接跳过
2. 给res添加完之后,别忘了return
相关文章推荐
- 一个程序员的顿悟:理想的程序员只比你多了6个一点点
- 【翻译】LearnYouSomeErlangForGreatGood(三):真·起始
- json 转换类型 的好方法
- 最大的两个数
- POJ 1655 Balancing Act 树的重心
- 菲波那切数列
- 给groupBox添加滚动条
- Android学习笔记--AIDL
- 信息安全基础虚拟机实验的一些问题及解决(win2003)
- 5.1.堆、栈、数据区、bss、代码段
- Android——RuntimePermission介绍
- nodejs
- unix网络编程卷1:套接字联网 源码编译
- UVA - 11732 "strcmp()" Anyone? (字典树的处理)
- Linux下软件的安装方法
- Codeforces 602B Approximating a Constant Range
- JavaWeb核心编程之(三.3)Servlet Init 配置
- hibernate学习 hibernate-tutorials(二)——annotations
- 分布式中使用Redis实现Session共享
- CodeForces 697B Barnicle 和 Codeforce 691 C Puzzles 科学计数法的正逆互推 CodeForces 691B 一个对称的小题;