LeetCode第46题全排列

简介: LeetCode第46题"全排列"的解题方法,利用回溯法避免重复并确保元素的有序性,生成所有可能的排列组合。

继续打卡算法题,今天学习的是LeetCode第46题全排列,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。

image.png

分析一波题目

哈哈,学习过之前的组合问题,这道题目就简单了,解决方法一样使用回溯来解决。

组合和排列定义不一样,组合的元素是无序的,而排列组成的元素是有序的,比如数组[1,2]的全组合只有[1,2],但是排列有[1,2]和[2,1]。

所以排列和组合取数有点区别,每次取其他元素需从第一个开始取,并且已经取过的不能取了,所以我们需要记录当前排列哪些数据已经取过了。

本题解题技巧

1、理解排列定义,排列是有顺序的。

2、每次都从第一个元素开始取数,但是一个数字在一个排列中只能出现一次。

编码解决

下面代码和组合总和II的代码非常相似。

class Solution {
   
   
    public List<List<Integer>> permute(int[] nums) {
   
   

        //递归 回溯
        boolean[] used = new boolean[nums.length];
        backtracking(nums, new ArrayList<>(), 0, 0, used);
        return result;
    }

    private List<List<Integer>> result = new ArrayList<>();


    public void backtracking(int[] nums,List<Integer> path, int startIndex, int sum, boolean[] used) {
   
   

        //结束条件
        if(path.size() == nums.length) {
   
   
            result.add(new ArrayList(path));
            return;
        }

        //递归单层逻辑
        for(int i=startIndex; i<nums.length; i++) {
   
   
               if(used[i] == true) {
   
   
                   continue;
               }
               path.add(nums[i]);
               sum += nums[i];
               used[i] = true;
               //开始递归 startIndex传i,就是考虑每个数字都可以重复使用的情况
               backtracking(nums, path, 0, sum, used);
               //回溯
               sum = sum - nums[i];
               used[i] = false;
               path.remove(path.size()-1);
        }
    }

}

总结

排列和组合都可以通过回溯法解决,理解了回溯解法之后,解决这种问题比较简单,这两类题目建议画出树图可以更好的理解递归逻辑。

相关文章
|
6月前
|
Java
leetcode-46:全排列
leetcode-46:全排列
42 1
|
6月前
leetcode47全排列2刷题打卡
leetcode47全排列2刷题打卡
35 0
|
6月前
|
Java
46. 全排列 --力扣 --JAVA
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
39 0
|
1月前
|
算法
Leetcode第46题(全排列)
这篇文章介绍了LeetCode第46题“全排列”的解题方法,使用深度优先搜索(DFS)和回溯算法来生成给定数组的所有可能排列。
25 0
Leetcode第46题(全排列)
|
1月前
Leetcode第47题(全排列II)
LeetCode第47题要求返回一个包含重复数字序列的所有不重复全排列,通过深度优先搜索和去重策略来解决。
28 0
|
3月前
|
算法
LeetCode第47题全排列II
LeetCode第47题"全排列II"的解题方法,通过排序和添加去重逻辑,使用回溯法避免生成重复的排列组合。
|
3月前
|
Python
【Leetcode刷题Python】46. 全排列
本文介绍了LeetCode题目46的Python编程解决方案,题目要求给定一个不含重复数字的数组,返回该数组所有可能的全排列。
23 0
|
5月前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
6月前
|
Go
golang力扣leetcode 47.全排列II
golang力扣leetcode 47.全排列II
78 0
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成