LeetCode每日1题--46. 全排列

62 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

leetcode.cn/problems/pe…

image.png

解析

这里是不需要通过startIndex去来控制遍历的元素,因为每个元素都要去遍历

我们通过used数组去进行去重,也就是得到一个元素就把它加入used数组,这样下次再遍历的时候判断used数组中该位置是否存在该元素即可实现去重

回溯三部曲

  1. 递归参数

递归的参数为int型的数组

返回值也是void,一般递归的会返回值都是为空,因为我们是收集元素的,不是要得到某一个值

private void permuteHelper(int[] nums){}
  1. 递归终止的条件

等到path数组收集元素够之后即可停止,也是一样的套路

这里的result.add(new ArrayList<>(path));是一种简化的写法,它可以将一维数组当成元素加入以为数组

if(path.size() == nums.length){
    result.add(new ArrayList<>(path));
    return;
}
  1. 单层搜索的逻辑

单层搜索的逻辑还是回溯的模版

for(...){

递归停止的条件

递归调用函数

移除元素

}

由于我们是求全排列,我们是通过used数组来进行去重,所以简单改一下模版

for(...){

递归停止的条件

used[i] = true;
递归调用函数

移除元素
used[i] = false;

}

for(int i = 0; i < nums.length; i++){
    if(used[i]){
        continue;
    }

    used[i] = true;
    path.add(nums[i]);
    permuteHelper(nums);
    path.removeLast();
    used[i] = false;

}

完整代码

是不是很简单呢?

哈哈哈,坚持练习!


class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    boolean[] used;
    public List<List<Integer>> permute(int[] nums) {
        used = new boolean[nums.length];
        permuteHelper(nums);
        return result;
    }

    private void permuteHelper(int[] nums){
        if(path.size() == nums.length){
            result.add(new ArrayList<>(path));
            return;
        }

        for(int i = 0; i < nums.length; i++){
            if(used[i]){
                continue;
            }

            used[i] = true;
            path.add(nums[i]);
            permuteHelper(nums);
            path.removeLast();
            used[i] = false;

        }
    }
}