全排列 - LeetCode 热题 55

2024-05-08 00:52
文章标签 leetcode 热题 排列

本文主要是介绍全排列 - LeetCode 热题 55,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好!我是曾续缘😆

今天是《LeetCode 热题 100》系列

发车第 55 天

回溯第 1 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

全排列

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

解题方法

这道题要求给定一个不含重复数字的数组,返回其所有可能的全排列。我们可以使用回溯算法来解决这个问题。

首先,我们将输入的数组 nums 转换为一个 ArrayList list_nums,方便进行元素交换操作。

接下来是 backtrack 方法,它采用递归的方式来生成全排列。在 backtrack 方法中,我们有两个参数,一个是当前的列表 nums,另一个是当前处理的位置 cur

首先,我们检查如果 cur 已经到达了列表的末尾,就将当前列表加入到最终结果 ans 中。

然后,我们从当前位置开始,枚举当前位置可以填入的值,也就是依次将当前位置的元素后面的元素进行交换,然后递归调用 backtrack 方法,处理下一个位置。

当递归调用完成后,说明我们已经将当前交换过的值的所有后续情况处理完了,我们需要将元素交换回来,使得列表回到交换前的状态,以确保下一次迭代时列表的顺序是正确的。

这样通过不断地交换元素和递归调用,直到遍历完整个数组,就能够得到所有可能的全排列。

Code

class Solution {public List<List<Integer>> permute(int[] nums) {List<List<Integer>> ans = new ArrayList<List<Integer>>();List<Integer> list_nums = new ArrayList<Integer>();for(int x : nums){list_nums.add(x);}backtrack(list_nums, 0, ans);return ans;}private void backtrack(List<Integer> nums, int cur, List<List<Integer>> ans){if(cur == nums.size()){ans.add(new ArrayList<Integer>(nums));}for(int i = cur; i < nums.size(); i++){Collections.swap(nums, cur, i);backtrack(nums, cur + 1, ans);Collections.swap(nums, cur, i);}}
}

这篇关于全排列 - LeetCode 热题 55的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968861

相关文章

贪心 + 证明:Leetcode 1953. 你可以工作的最大周数

描述 给你 n 个项目,编号从 0 到 n - 1 。同时给你一个整数数组 milestones ,其中每个 milestones[i] 表示第 i 个项目中的阶段任务数量。 你可以按下面两个规则参与项目中的工作: 每周,你将会完成 某一个 项目中的 恰好一个 阶段任务。你每周都 必须 工作。 在 连续的 两周中,你 不能 参与并完成同一个项目中的两个阶段任务。 一旦所有项目中的全部阶段任务

02 LeetCode-- 反转数组的两种方式、

反转数组 创建新数组 首尾交换

LeetCode算法题:15. 三数之和(Java)

题目描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请 你返回所有和为 0 且不重复的三元组。 注意: 答案中不可以包含重复的三元组。 示例 1: 输入:nums = [-1,0,1,2,-1

牛客热题:合并二叉树

牛客热题:二叉树与双向链表> 📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:合并二叉树题目链接方法一:递归思路代码复杂度 牛客热题:合并二叉树 题目链接 合并二叉树_牛客题霸_牛客网 (nowcoder.com) 方法一:递归 思路 将结果集合到t1树上 当t2树为空时,直

排列组合(一)全排列

问题描述 输出一个字符数组元素的全排列 如 输入:'a','b','c'结果:a,b,cb,a,cc,b,aa,c,bb,c,ac,a,b6 解决思路 这个问题是一个全排列问题,数学计算为A(n,n)。数学思路为,n个元素,第一位可以为n种可能,第二位可以有n-1种可能,以此类推所以全排列的种类一共有n!个。 以此为思路,我们可以从初始化顺序开始, 首先确定第一位,第一位一共有

【算法刷题day55】Leetcode:583. 两个字符串的删除操作、72. 编辑距离

文章目录 Leetcode 583. 两个字符串的删除操作解题思路代码总结 Leetcode 72. 编辑距离解题思路代码总结 草稿图网站 java的Deque Leetcode 583. 两个字符串的删除操作 题目:583. 两个字符串的删除操作 解析:代码随想录解析 解题思路 dp数组的含义是,从word1从0到i-1,word2从0到j-1匹配上最少需要删除

【LeetCode】每日一题:1953.你可以工作的最大周数

给你 n 个项目,编号从 0 到 n - 1 。同时给你一个整数数组 milestones ,其中每个 milestones[i] 表示第 i 个项目中的阶段任务数量。 你可以按下面两个规则参与项目中的工作: 每周,你将会完成 某一个 项目中的 恰好一个 阶段任务。你每周都 必须 工作。 在 连续的 两周中,你 不能 参与并完成同一个项目中的两个阶段任务。 一旦所有项目中的全部阶段任务都完成,或

完成所有任务的最少时间 - (LeetCode)

前言 今天也是很无精打采的一天,早上看到这道题,都有点懵逼,开始也不懂如何入手,既然自己搞不定,就顺便测试了一下AI吧,测试了通义千问和文心一言,把题目拿去那里问,可以把解题思路写出来,代码也写了,但是我拿到AI的代码来运行,发现2个平台的代码都是运行不通过的,说明AI对这种算法题,是不对的,AI测试了一轮,只好自己去理解了,看了一下AI的代码,给自己一些思路,按照自己的思路去优化代码最终通过。

搜索二维矩阵 - LeetCode 热题 64

大家好!我是曾续缘🧡 今天是《LeetCode 热题 100》系列 发车第 64 天 二分查找第 2 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返

Leetcode - 周赛397

目录 一,3146. 两个字符串的排列差 二,3147. 从魔法师身上吸取的最大能量 三,3148. 矩阵中的最大得分 四,3149. 找出分数最低的排列 一,3146. 两个字符串的排列差 本题就是求同一个字符在两个字符串中的下标之差的绝对值的和,可以使用数组来统计字符的下标,再求下标之差的绝对值的和。 代码如下: class Solution {public