从零刷算法-全排列

324 阅读1分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。

题目描述

给定一个不含重复数字的数组 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 中的所有整数 互不相同

题目链接:[全排列]

思路介绍

最开始 最外层循环i=0 此时添加1进入path 然后进入递归,也就进入了中间层的循环 i=0,不行,因为1已经在path里面了 中间层的i=1,可以,添加2进入path,然后进入递归,进入了最里层的循环i=0,不行,最里层的i=1,不行,最里层的i=2,可以,添加3到path里面 再进行递归,此时path.size()==nums.length了,存数据,跳出,执行最里层i=2的path.removeLast(),删除掉了3,此时回到中间层的i=1,又执行一次中间层i=1的path.removeLast() 此时删除掉了2,path只有1了,中间层i=1就算结束 进入中间层的i=2,添加了3进入path,此时path中是1,3,然后进入最里层循环i=0,不行,最里层的1,可以,添加2到path里面,此时path又满了,再次存数据,跳出。 执行最里层i=1的remove,此时剩下1,3。执行最里层的i=2,不行。 此时中间层i=2的backtracking就算运行完了,remove,此时path中只有1了 然后最外层i=0时的backtracking也算运行完了,remove,此时path就没有东西了 执行最外层i=1,然后操作流程就如上进行重复 整个流程就是这样走nums.length次,也就是for的次数

因此path中是null-> 1 -> 1,2->1,2,3(result.add)->1,2->1->1,3->1,3,2(result.add)->1,3->1-null->2->2,1-2,1,3(result.add)->...->3,2,1->...->null 因为最后一定是null,所以result.add(new LinkedList<>(path)) 而不能是result.add(path)

代码

class Solution {
    LinkedList<Integer> path=new LinkedList<>();
    List<List<Integer>> result=new ArrayList<>();

    public List<List<Integer>> permute(int[] nums) {
        backtracking(nums);
        return result;
    }

    public void backtracking(int[] nums){
      
        if(path.size()==nums.length){
            result.add(new LinkedList<>(path));
            return;
        }
 
        for(int i=0;i<nums.length;i++){
           
            if(path.contains(nums[i])){
                continue;
            }
            path.add(nums[i]);
            backtracking(nums);
            path.removeLast();
                 
        }
    }
}

运行结果

执行结果:通过

执行用时:1 ms,

内存消耗:41.5MB