LeetCode(44)Permutations
来源:互联网 发布:mac 如何装office 免费 编辑:程序博客网 时间:2024/06/05 16:08
题目如下:
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].
思考分析:
如果要生成[1,2,3]的所有排列。则先生成[1,2]的所有排列
[1,2]
[2,1]
然后
把3放入[1, 2]的所有可能位置: [1, 2]->[3, 1, 2], [1, 3, 2], [1, 2, 3]
把3放入[2, 1]的所有可能位置: [2, 1]->[3, 2, 1], [2, 3, 1], [2, 1, 3]
代码如下:
第一种, 递归:
class Solution { //56mspublic: vector<vector<int> > permute(vector<int> &num) { if (num.size() == 1){ vector<int> inner_result(1,num[0]); vector<vector<int> > outer_result(1,inner_result); return outer_result; } else { vector<int> sub_num(num.begin() + 1, num.end()); vector<vector<int> > outer_result = permute(sub_num); vector<vector<int> > new_outer; vector<int> new_inner; for (int i = 0; i < outer_result.size(); ++i) { for (int j = 0; j <= outer_result[i].size(); ++j) { new_inner = outer_result[i]; new_inner.insert(new_inner.begin() + j, num[0]); new_outer.push_back(new_inner); } } return new_outer; } }};
第二种, 迭代:
class Solution { //80mspublic: vector<vector<int> > permute(vector<int> &num) { vector<vector<int> > empty_vec_vec; if(num.size()==0) return empty_vec_vec; vector<int> inner_result(1, num[0]); vector<vector<int> > outer_result(1, inner_result); vector<vector<int> > new_outer_result; for (int i = 1; i < num.size(); ++i ) { for (int j = 0; j < outer_result.size(); ++j) { for (int k = 0; k < inner_result.size(); ++k) { inner_result = outer_result[j]; inner_result.insert(inner_result.begin() + k, num[i]); //node insert(argv1, argv2), argv1 is the iterator position. new_outer_result.push_back(inner_result); } } outer_result = new_outer_result; //更新中间结果 new_outer_result.clear(); //清零!! } return outer_result; }};
update: 2015-03-03
其实更简洁的写法是,经典的DFS的思路的写法。下面的这段说明转载自这里。
The idea of this classic problem is to use backtracking.
We want to get permutations, which is mainly about swap values in the list.
Consider:
a --> a
ab --> ab, ba
abc --> abc, acb, bac, bca, cab, cba.
...
where for the length of n, the permutations can be generated by
(1) Swap the 1st element with all the elements, including itself.
(2) Then the 1st element is fixed, go to the next element.
(3) Until the last element is fixed. Output.
It's more clear in the figure above. The key point is to make the big problem into smaller problem, here is how to convert the length n permutation into length n-1 permutation problem.
// 18msclass Solution {private: void print1(vector<int> v) { std::cout<<"--------1---------"<<std::endl; for (int i = 0; i < v.size(); ++i) std::cout<<v[i]<<"\t"; std::cout<<std::endl; } void print2(vector<vector<int> > v) { std::cout<<"--------2---------"<<std::endl; int count = 0; for (int i = 0; i < v.size(); ++i) { for (int j = 0; j < v[i].size(); ++j) { std::cout<<v[i][j]<<"\t"; } count++; std::cout<<std::endl; } std::cout<<"total = "<<count<<std::endl; } void swap(vector<int> &num, int i, int j) { int temp = num[i]; num[i] = num[j]; num[j] = temp; } void dfs(vector<int> & num, int k, int n, vector<vector<int> > & result) { if (k == n){ result.push_back(num); }else { for (int i = k; i <= n; ++i) { //i = k, i与包含自己在内的后面的所有元素进行交换。 swap(num, k, i); dfs(num, k+1, n, result); swap(num, k, i); } } } public: vector<vector<int> > permute(vector<int> &num) { vector<vector<int> > result; dfs(num, 0, num.size() -1 , result); print2(result); return result; }};
- LeetCode(44)Permutations
- LeetCode OJ-44-Permutations
- 【LeetCode】Permutations && Permutations II
- leetcode: Permutations/Permutations II
- leetcode Permutations & Permutations II
- [Leetcode]Permutations && Permutations II
- LeetCode: Permutations
- LeetCode: Permutations
- [Leetcode] Permutations
- [LeetCode] Permutations
- Leetcode: Permutations
- [Leetcode] Permutations
- [Leetcode] Permutations
- [LeetCode]Permutations
- LeetCode-Permutations
- [leetcode] permutations
- LeetCode - Permutations
- Leetcode: Permutations
- apache2.2和php5.4.2在windows下的安装
- 关计算机发展方向
- PHP下载xml源文件并转码解析
- 进程和线程
- 水晶报表隐藏空值字段
- LeetCode(44)Permutations
- 手动添加mysql服务
- SD佛山ZD风
- oracle导入导出数据不完整问题
- Leetcode wild card matching
- python复习笔记
- 打架后
- 广义Fibonacci数列找循环节
- Get Minimal value in constant time from a LIFO(and FIFO) stack