基础知识要求:
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))