一、题目描述:
给定一个不含重复数字的数组 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 中的所有整数 互不相同
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pe…
二、思路分析:
利用回溯的思想,终止条件:当output中的元素个数为n时说明这种排列完成,传入res
步骤如下:
首先初始化当len(nums)=1的情况,即result[0]=[[nums[0]]],
然后利用result[0]的结果来求解result[1],
求得result[1]后再利用result[1]来求解result[2],等等以此类推,
直到求出result[len(nums)-1],并返回该值。
三、AC代码
class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = new ArrayList<List<Integer>>(); List<Integer> output = new ArrayList<Integer>(); for (int num : nums) { output.add(num); } int n = nums.length; backtrack(n, output, res, 0); return res; } public void backtrack(int n, List<Integer> output, List<List<Integer>> res, int first) { // 所有数都填完了 if (first == n) { res.add(new ArrayList<Integer>(output)); } for (int i = first; i < n; i++) { // 动态维护数组 Collections.swap(output, first, i); // 继续递归填下一个数 backtrack(n, output, res, first + 1); // 撤销操作 Collections.swap(output, first, i); } } }
四、总结:
网络异常,图片无法展示
|
找回溯的三个步骤:
1.找输入输出的参数,一般根据后两个步骤确定所需传入的参数
2.找递归终止条件
3.找单层递归逻辑
掘友们,解题不易,如果觉得有用就留下个赞或评论再走吧!谢啦~ 💐