[LeetCode] 46. Permutations 全排列
2018-03-13 05:44
399 查看
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].
Given a collection of distinct 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], [3,2,1] ]
给一个没有重复的数组,返回全部的排列可能。
解法:递归Backtracking
Java:
public List<List<Integer>> permute(int[] nums) { List<List<Integer>> list = new ArrayList<>(); // Arrays.sort(nums); // not necessary backtrack(list, new ArrayList<>(), nums); return list; } private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){ if(tempList.size() == nums.length){ list.add(new ArrayList<>(tempList)); } else{ for(int i = 0; i < nums.length; i++){ if(tempList.contains(nums[i])) continue; // element already exists, skip tempList.add(nums[i]); backtrack(list, tempList, nums); tempList.remove(tempList.size() - 1); } } }
Python: Recursion
class Solution: # @param num, a list of integer # @return a list of lists of integers def permute(self, num): result = [] used = [False] * len(num) self.permuteRecu(result, used, [], num) return result def permuteRecu(self, result, used, cur, num): if len(cur) == len(num): result.append(cur[:]) return for i in xrange(len(num)): if not used[i]: used[i] = True cur.append(num[i]) self.permuteRecu(result, used, cur, num) cur.pop() used[i] = False
C++: Recursion
class Solution { public: vector<vector<int> > permute(vector<int> &num) { vector<vector<int> > res; permuteDFS(num, 0, res); return res; } void permuteDFS(vector<int> &num, int start, vector<vector<int> > &res) { if (start >= num.size()) res.push_back(num); for (int i = start; i < num.size(); ++i) { swap(num[start], num[i]); permuteDFS(num, start + 1, res); swap(num[start], num[i]); } } };
C++: Recursion
class Solution { public: vector<vector<int> > permute(vector<int> &num) { vector<vector<int> > res; vector<int> out; vector<int> visited(num.size(), 0); permuteDFS(num, 0, visited, out, res); return res; } void permuteDFS(vector<int> &num, int level, vector<int> &visited, vector<int> &out, vector<vector<int> > &res) { if (level == num.size()) res.push_back(out); else { for (int i = 0; i < num.size(); ++i) { if (visited[i] == 0) { visited[i] = 1; out.push_back(num[i]); permuteDFS(num, level + 1, visited, out, res); out.pop_back(); visited[i] = 0; } } } } };
类似题目:
[LeetCode] 47. Permutations II 全排列 II
[LeetCode] 31. Next Permutation 下一个排列
[LeetCode] 60. Permutation Sequence 序列排序
All LeetCode Questions List 题目汇总
相关文章推荐
- LeetCode—**字符串中数字的全排列问题Permutations
- leetcode-46. Permutations(非重复元素全排列)
- leetcode_permutaionu全排列集合_31_46_47_60
- 【LeetCode51-60】N皇后,和最大子串,螺旋矩阵,跳跳棋,合并区间,第K个全排列
- [C++]LeetCode: 115 Permutations (求一组数的全排列)
- LeetCode:60. Permutation Sequence,全排列的第n个子列
- 【LeetCode41-50】找出丢失最小正整数,计算蓄水量,检测?*匹配(44),跳跳棋,全排列,矩阵逆转,颠倒字母重新排序(auto,set/multiset,vector初始化),n次方
- LeetCode-46 Permutations(全排列)
- LeetCode(Permutations) 数列的全排列
- LeetCode | Permutation Sequence(找到全排列中的第k个排列)
- 一次搞懂全排列——LeetCode四道Permutations问题详解
- 每天一道LeetCode-----获取无重复项/有重复项序列的全排列
- LeetCode(Permutation Sequence)输出全排列中第k个排列
- LeetCode--Permutations II 全排列之二
- LeetCode 60. Permutation Sequence 全排列的第k个
- leetcode - 47. Permutations II(全排列)
- LeetCode-------60. Permutation Sequence(n的全排列中第K列)
- [LeetCode] “全排列”问题系列(一) - 用交换元素法生成全排列及其应用,例题: Permutations I 和 II, N-Queens I 和 II,数独问题
- [Leetcode] permutations 全排列
- 深度优先-Leetcode46 全排列