Leetcode:Permutations 数组的全排列
2014-04-14 10:07
375 查看
Leetcode刷题刷到了Permutation,自己用递归写了一下数组全排列的算法,再深入理解一下递归的算法思想。
在遇到稍微复杂的问题之后要尝试从简单的问题入手,举几个小例子,找到规律,然后用程序语言描述出规律就OK了。
假如数组是[1,2,3],其全排列为[1,2,3],[1,3,2],[2,1,3],2,3,1],[3,2,1],[3,1,2].
全排列的过程如下:
1.首先将1固定,递归求子数组[2,3]的全排列;
2.将1和2交换,递归求[1,3]的全排列;
3.因为第二步中1和2进行了交换,因此需要再把1交换回来,交换回来之后再将1和3进行交换,再递归求[1,2]的全排列。
递归结束的条件是只剩下一个元素时,把整个排列好的数组存入一个二维数组中。
代码如下:
在遇到稍微复杂的问题之后要尝试从简单的问题入手,举几个小例子,找到规律,然后用程序语言描述出规律就OK了。
假如数组是[1,2,3],其全排列为[1,2,3],[1,3,2],[2,1,3],2,3,1],[3,2,1],[3,1,2].
全排列的过程如下:
1.首先将1固定,递归求子数组[2,3]的全排列;
2.将1和2交换,递归求[1,3]的全排列;
3.因为第二步中1和2进行了交换,因此需要再把1交换回来,交换回来之后再将1和3进行交换,再递归求[1,2]的全排列。
递归结束的条件是只剩下一个元素时,把整个排列好的数组存入一个二维数组中。
代码如下:
class Solution { public: void swap(int &a,int &b) { int temp = a; a = b; b = temp; } void permutation(vector<int> &num,int begin,int end,vector<vector<int> > &vec) { if(begin == end) vec.push_back(num); if(begin < end) { for(int i = begin;i <= end;i++) { swap(num[begin],num[i]); permutation(num,begin + 1,end,vec); swap(num[begin],num[i]); } } } vector<vector<int> > permute(vector<int> &num) { int length = num.size(); vector<vector<int> > vec; if(length == 0)return vec; permutation(num,0,length - 1,vec); return vec; } };
相关文章推荐
- “全排列”问题系列(一)[LeetCode] - 用交换元素法生成全排列及其应用,例题: Permutations I 和 II, N-Queens I 和 II,数独问题
- [C++]LeetCode: 115 Permutations (求一组数的全排列)
- 一次搞懂全排列——LeetCode四道Permutations问题详解
- leetcode之全排列问题(Permutations)
- LeetCode | Permutations(全排列)
- LeetCode—**字符串中数字的全排列问题Permutations
- LeetCode 46 Permutations (全排列)
- LeetCode-----46.Permutations&&47.Permutations II (全排列----回溯法)
- [LeetCode] “全排列”问题系列(一) - 用交换元素法生成全排列及其应用,例题: Permutations I 和 II, N-Queens I 和 II,数独问题
- [Leetcode] permutations 全排列
- LeetCode 46 Permutations(全排列问题)
- 全排列,字典顺序问题 ( permutations/leetcode)
- [leetcode 46] Permutations------数组中元素的所有排列组合集合
- leetcode46/47-Permutations I/II(全排列问题)
- LeetCode(Permutations) 数列的全排列
- LeetCode-46 Permutations(全排列)
- LeetCode Permutations II (全排列)
- [Leetcode] Permutations
- Leetcode Permutations
- Leetcode 88 Merge Sorted Array 合并两个有序数组