leetcode46 全排列
问题描述
回溯算法:
- 对于两个元素的全排列为: a, b 和 swap(a, b)
- 利用递归方法:
n个元素的全排列为:nums[0], permute(nums[1 : n - 1]和swap(nums[0], permute(nums[1 : n - 1] - 利用回溯方法进行递归运算
public List<List<Integer>> permute(int[] nums){
List<List<Integer>> res = new ArrayList<>();
List<Integer> p = new ArrayList<>();
for(int num : nums){
p.add(num);
}
permute(p, 0, res);
return res;
}
private void permute(List<Integer> nums, int index, List<List<Integer>> res){
if(index == nums.size()){
res.add(new ArrayList<Integer>(nums));
return;
}
for(int i = index; i < nums.size(); i ++){
Collections.swap(nums, index, i);
permute(nums, i, res);
Collections.swap(nums, index, i); //回溯
}
}
参考别人代码 链接https://leetcode-cn.com/problems/permutations/solution/quan-pai-lie-by-leetcode/
class Solution {
public void backtrack(int n,
ArrayList<Integer> nums,
List<List<Integer>> output,
int first) {
// if all integers are used up
if (first == n)
output.add(new ArrayList<Integer>(nums));
for (int i = first; i < n; i++) {
// place i-th integer first
// in the current permutation
Collections.swap(nums, first, i);
// use next integers to complete the permutations
backtrack(n, nums, output, first + 1);
// backtrack
Collections.swap(nums, first, i);
}
}
public List<List<Integer>> permute(int[] nums) {
// init output list
List<List<Integer>> output = new LinkedList();
// convert nums into list since the output is a list of lists
ArrayList<Integer> nums_lst = new ArrayList<Integer>();
for (int num : nums)
nums_lst.add(num);
int n = nums.length;
backtrack(n, nums_lst, output, 0);
return output;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/permutations/solution/quan-pai-lie-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。