LeetCode #46 全排列
Posted 三笠·阿卡曼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode #46 全排列相关的知识,希望对你有一定的参考价值。
题目
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例
代码
package com.vleus.algorithm.backtrack;
import java.util.*;
/**
* @author vleus
* @date 2021年06月26日 22:03
*/
public class Permutation {
//定义一个辅助集合,保存已经用过的数
Set<Integer> filledNums = new HashSet<>();
//回溯实现
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
//用一个List保存一组解
List<Integer> solution = new ArrayList<>();
//从0位置开始填充数
backtrack(nums,result,solution,0);
return result;
}
//实现一个回溯方法,方便递归调用
public void backtrack(int[] nums, List<List<Integer>> result, List<Integer> solution, int i) {
int n = nums.length;
//首先判断退出递归调用的场景
if (i >= n) {
result.add(new ArrayList<>(solution));
} else {
// 需要对当前i位置选数填入,需要遍历数组中所有数,取没有用过的数进行填充
for (int j = 0; j < n; j++) {
if (!filledNums.contains(nums[j])) {
//如果没用过直接填入
solution.add(nums[j]);
filledNums.add(nums[j]);
//递归调用,处理下一个位置
backtrack(nums, result, solution, i + 1);
// 回溯,回退状态
solution.remove(i);
filledNums.remove(nums[j]);
}
}
}
}
// 空间优化
public List<List<Integer>> permute1(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
//用一个List保存一组解
List<Integer> solution = new ArrayList<>();
//将nums复制到solution
for (int num : nums) {
solution.add(num);
}
//从0位置开始填充数
backtrack1(result,solution,0);
return result;
}
//实现一个回溯方法,方便递归调用
public void backtrack1(List<List<Integer>> result, List<Integer> solution, int i) {
int n = solution.size();
//首先判断退出递归调用的场景
if (i >= n) {
result.add(new ArrayList<>(solution));
} else {
// 需要对当前i位置选数填入,需要遍历数组中所有数,取没有用过的数进行填充
for (int j = i; j < n; j++) {
Collections.swap(solution, i, j);
//递归调用,处理后面的位置
backtrack1(result,solution,i+1);
//回溯
Collections.swap(solution, i, j);
}
}
}
}
以上是关于LeetCode #46 全排列的主要内容,如果未能解决你的问题,请参考以下文章
[Leetcode 46]全排列 Permutations 递归