给定一个不含重复数字的数组 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]
解法一:递归求解
总是想把后面的数据放到首位,这样可能会更方便
自我消化,自我解决,交换
List<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> permute(int[] nums) { if (nums.length == 0) return res; int length = nums.length; List<Integer> temp = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { temp.add(nums[i]); } pereur(nums, temp, 0, length); return res; } private void pereur(int[] nums, List<Integer> lst, int level, int length) { if (level == length) { res.add(new ArrayList<Integer>(lst)); System.out.println(lst); return; } for (int i = level; i < nums.length; i++) { Collections.swap(lst, level, i); pereur(nums, lst, level + 1, length); Collections.swap(lst, level, i); } }
时间复杂度:O(n \times n!)O(n×n!),其中 nn 为序列的长度。空间复杂度O(n)
说是回溯法,没有感觉到,其实就是没有窍门的交换