LeetCode刷题之T46全排列(中等)
大家好,这次我们讲解的题目是LeetCode刷题之T46全排列(中等),话不多说,上题:
解题思路:
这道题的要用到回溯算法,而解决每一个回溯问题,实际上就是一个决策树的问题,不明白的话,我举个例子:
我们可以先看图:
由图我们看出:[1,2,3]使我们的一组解,跟着我来分析:
1:首先选择的1。
2:接着可以选1,2,3,我们先选1,但是1选择过了(nums不重复的数组),所以我们只能够往回走,即1->1为叉叉
3:接着我们可以选1->2
4:我们选择了1->2,接着我们可以选1,2,3,如果我们选择1,就是1->2->1,但是1选过了,就要往回走,看看能不能1->2->2,但是2选过了,我们看能不能选择3,1->2->3,可以。
经过上面的分析,什么叫回溯就出来了,其实本质就是一个决策树,树的分支代表你的选择情况(决策),就是我们往回走,回到上一步。
那么我们怎么设计算法呢?
我还是拿上面那张图
算法设计思路:
1:定义一个track,代表路径,用track来记录我们的路径,当track的程度等于nums的长度,就说明这个是其中的一种排列情况。
2:因为nums数组里的数不可重复,所以track里面出现过的数,就代表我们不需要往分支在track里面存在过的数,比如上如,1->1,行不通,因为track[1]里面存在1,上图简易的用三元运算表示了一下,存在,那么回溯,不存在那么添加进track,说明我们当前是最终的一个排列的组成部分。
3:根据上述说明结合上图,就能得到我们算法的设计思路,这个只是图只是其中一部分,所以我们采用递归的方法。
接下来上代码:
class Solution {//返回结果List<List<Integer>> res = new LinkedList<List<Integer>>(); //表示结果public List<List<Integer>> permute(int[] nums) {LinkedList<Integer> track=new LinkedList<>(); //表示当前的路径backtrack(nums,track); //数组和当前的走过的路径放进去 递归函数return res;}// 递归函数public void backtrack(int[] nums,LinkedList<Integer> track){//递归的结束条件,track的长度和数组长度相等,则说明当前track为一次排列if(track.size()==nums.length){res.add(track);return;}//判断条当前决策是否能添加进track for(int i=0;i<nums.length;i++){if(track.contains(nums[i])){ //因为数组无重复数字,说明此数字已经用过,此路不通 continue; }track.add(nums[i]); //添加进当前的路径backtrack(nums,track);//保存当前的看路径继续递归track.removeLast(); //取消track的最后一个,也就是返回上一次的决策。}}
}
这道题难度较高,需要仔细结合图片以及理解递归,决策,回溯的概念就能更好的理解!
哈哈有点惨不忍睹!如果有更好的想法欢迎在下方留言!希望能帮助到大家!谢谢!
LeetCode刷题之T46全排列(中等)相关推荐
- C#LeetCode刷题-位运算
位运算篇 # 题名 刷题 通过率 难度 78 子集 67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 1 ...
- Leetcode刷题
刷题 leetcode 1.两数之和 #哈希表 class Solution:def twoSum(self, nums: List[int], target: int) -> List[int ...
- 个人LeetCode刷题记录(带题目链接及解答)持续更新
Leetcode 刷题 注:~[完成]代表还有一些方法没看,最后再看 一.一些需要重刷的典型题: 1.快速排序,归并排序,堆排序(递归的思想) 2.链表中的回文链表,其中的快慢指针,多看,多练 3.链 ...
- c语言贪心算法合并箭,LeetCode刷题题库:贪心算法
LeetCode刷题笔记:贪心算法 自大学开始,我便陆陆续续的学习一些 算法和数据结构 方面的内容,同时也开始在一些平台刷题,也会参加一些大大小小的算法竞赛.但是平时刷题缺少目的性.系统性,最终导致算 ...
- C#LeetCode刷题-队列
队列篇 # 题名 刷题 通过率 难度 363 矩形区域不超过 K 的最大数值和 27.2% 困难 621 任务调度器 40.9% 中等 622 设计循环队列 C#LeetCode刷题之#622-设计循 ...
- C#LeetCode刷题-二叉搜索树
二叉搜索树篇 # 题名 刷题 通过率 难度 220 存在重复元素 III 19.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 327 区间和的个数 29.5% 困难 352 将数据 ...
- C#LeetCode刷题-字典树
字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树) 48.6% 中等 211 添加与搜索单词 - 数据结构设计 39.9% 中等 212 单词搜索 II 27.9% 困难 33 ...
- C#LeetCode刷题-设计
设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制 33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索树迭 ...
- C#LeetCode刷题-树
树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历 61.6% 中等 95 不同的二叉搜索树 II 43.4% 中等 96 不同的二叉搜索树 51.6% 中等 98 验证二叉搜索树 22.2% ...
最新文章
- Python:数据集成
- nginx-启动gzip、虚拟主机、请求转发、负载均衡
- 电子设计竞赛电源题(2)-检波与采样
- 计算机二级考试都怎么考,计算机二级都考什么 怎么考
- mysql企业监控_mysql企业监控
- python codefirst_Python code.co_consts方法代码示例
- 【printf函数与scanf函数】(学习笔记5--标准I/O函数)
- 从表征到行动---意向性的自然主义进路(续五)
- 电脑显示没有被指定在上运行_电脑显示“没有被指定在windows上运行,或者它包含错误”怎么解决?...
- 贷款综合管理系统搭建-全流程智能、高效、安全管理解决方案
- 前端用ps创建画布的分辨率应该设置的值
- 又是一年双11,神棍节终于来啦
- c# 讯飞语音 sdk
- mongodb-报错FailedToParse: Password must be URL Encoded for mongodb:// URL:
- 会声会影2021版本下载地址安装包新增功能图文介绍
- 小程序loding动画组件封装及源码
- 我和谷歌共成长-资深安卓开发的转型之路
- android 视频裁剪view拖动,android – 视频使用特定坐标裁剪或缩放?
- 北京朝阳一互联网公司被端,警方上门,23人被带走…这种开发千万别干
- PMI、国家外专局-项目管理高端论坛在深圳召开