大家好,这次我们讲解的题目是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全排列(中等)相关推荐

  1. C#LeetCode刷题-位运算

    位运算篇 # 题名 刷题 通过率 难度 78 子集 67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 1 ...

  2. Leetcode刷题

    刷题 leetcode 1.两数之和 #哈希表 class Solution:def twoSum(self, nums: List[int], target: int) -> List[int ...

  3. 个人LeetCode刷题记录(带题目链接及解答)持续更新

    Leetcode 刷题 注:~[完成]代表还有一些方法没看,最后再看 一.一些需要重刷的典型题: 1.快速排序,归并排序,堆排序(递归的思想) 2.链表中的回文链表,其中的快慢指针,多看,多练 3.链 ...

  4. c语言贪心算法合并箭,LeetCode刷题题库:贪心算法

    LeetCode刷题笔记:贪心算法 自大学开始,我便陆陆续续的学习一些 算法和数据结构 方面的内容,同时也开始在一些平台刷题,也会参加一些大大小小的算法竞赛.但是平时刷题缺少目的性.系统性,最终导致算 ...

  5. C#LeetCode刷题-队列

    队列篇 # 题名 刷题 通过率 难度 363 矩形区域不超过 K 的最大数值和 27.2% 困难 621 任务调度器 40.9% 中等 622 设计循环队列 C#LeetCode刷题之#622-设计循 ...

  6. C#LeetCode刷题-二叉搜索树

    二叉搜索树篇 # 题名 刷题 通过率 难度 220 存在重复元素 III 19.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 327 区间和的个数 29.5% 困难 352 将数据 ...

  7. C#LeetCode刷题-字典树

    字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树) 48.6% 中等 211 添加与搜索单词 - 数据结构设计 39.9% 中等 212 单词搜索 II 27.9% 困难 33 ...

  8. C#LeetCode刷题-设计

    设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制 33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索树迭 ...

  9. C#LeetCode刷题-树

    树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历 61.6% 中等 95 不同的二叉搜索树 II 43.4% 中等 96 不同的二叉搜索树 51.6% 中等 98 验证二叉搜索树 22.2% ...

最新文章

  1. Python:数据集成
  2. nginx-启动gzip、虚拟主机、请求转发、负载均衡
  3. 电子设计竞赛电源题(2)-检波与采样
  4. 计算机二级考试都怎么考,计算机二级都考什么 怎么考
  5. mysql企业监控_mysql企业监控
  6. python codefirst_Python code.co_consts方法代码示例
  7. 【printf函数与scanf函数】(学习笔记5--标准I/O函数)
  8. 从表征到行动---意向性的自然主义进路(续五)
  9. 电脑显示没有被指定在上运行_电脑显示“没有被指定在windows上运行,或者它包含错误”怎么解决?...
  10. 贷款综合管理系统搭建-全流程智能、高效、安全管理解决方案
  11. 前端用ps创建画布的分辨率应该设置的值
  12. 又是一年双11,神棍节终于来啦
  13. c# 讯飞语音 sdk
  14. mongodb-报错FailedToParse: Password must be URL Encoded for mongodb:// URL:
  15. 会声会影2021版本下载地址安装包新增功能图文介绍
  16. 小程序loding动画组件封装及源码
  17. 我和谷歌共成长-资深安卓开发的转型之路
  18. android 视频裁剪view拖动,android – 视频使用特定坐标裁剪或缩放?
  19. 北京朝阳一互联网公司被端,警方上门,23人被带走…这种开发千万别干
  20. PMI、国家外专局-项目管理高端论坛在深圳召开

热门文章

  1. 初学者使用html制作的一个新闻页面
  2. 摩尔斯电码、摩斯电码
  3. 数据挖掘与机器学习:顺序与选择结构
  4. 普元 AppServer 6.5 支持哪些日志级别?
  5. 诺基亚5800XM触控音乐全解析
  6. DDL命令及基础知识
  7. linux学习(一)虚拟机界面全屏
  8. 如何提取多元回归lm里面的全模型的R2和p值
  9. 2022-07-09 cpu并行化指令集SIMD/AVX性能对比测试
  10. 爬虫(三)- 寻找周杰伦的歌单,json()