基础知识要求:
Java:方法、集合、泛型、Arrays工具类、数组、for循环、if判断
Python: 方法、列表、for循环、if判断
题目:
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1] 输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1] 输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
思路解析:
为了生成一个数组的所有可能全排列,我们可以使用回溯法(backtracking)。回溯法是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些更改来丢弃该解,即“回溯”并尝试其他可能的解。
Java代码示例:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Permutations {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
int n = nums.length;
boolean[] used = new boolean[n];
List<Integer> tempList = new ArrayList<>();
backtrack(nums, used, tempList, result, 0);
return result;
}
private void backtrack(int[] nums, boolean[] used, List<Integer> tempList, List<List<Integer>> result, int first) {
if (first == nums.length) {
result.add(new ArrayList<>(tempList)); // 添加当前排列到结果中
}
for (int i = 0; i < nums.length; i++) {
if (!used[i]) { // 如果当前数字没有被使用过
used[i] = true; // 标记为已使用
tempList.add(nums[i]); // 将当前数字添加到当前排列中
backtrack(nums, used, tempList, result, first + 1); // 递归进行下一个数字的排列
tempList.remove(tempList.size() - 1); // 回溯,撤销当前选择
used[i] = false; // 回溯,撤销使用标记
}
}
}
public static void main(String[] args) {
Permutations permutations = new Permutations();
int[] nums = {1, 2, 3};
List<List<Integer>> result = permutations.permute(nums);
for (List<Integer> permutation : result) {
System.out.println(permutation);
}
}
}
Python代码示例:
def permute(nums):
def backtrack(first = 0):
# 如果所有整数都填完了
if first == n:
output.append(nums[:])
for i in range(first, n):
# 动态地维护数组
nums[first], nums[i] = nums[i], nums[first]
# 继续递归填下一个数
backtrack(first + 1)
# 撤销操作
nums[first], nums[i] = nums[i], nums[first]
n = len(nums)
output = []
backtrack()
return output
# 示例
nums = [1,2,3]
print(permute(nums))