当前位置: 首页 > news >正文

【代码随想录Day25】回溯算法Part04

491.递增子序列

题目链接/文章讲解:代码随想录
视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili

class Solution {List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> findSubsequences(int[] nums) {backtracing(nums, 0);return result;}public void backtracing(int[] nums, int startIndex) {if (path.size() > 1) {result.add(new ArrayList<>(path));}// 使用 HashSet 来记录当前层级已经使用过的数字,避免重复Set<Integer> used = new HashSet<>();for (int i = startIndex; i < nums.length; i++) {// 如果当前数字已经在当前层级使用过,或者它小于 path 中的最后一个元素,跳过if (used.contains(nums[i]) || (!path.isEmpty() && nums[i] < path.getLast())) {continue;}// 标记当前数字为已使用used.add(nums[i]);path.add(nums[i]);backtracing(nums, i + 1);path.removeLast();}}
}

46.全排列

题目链接/文章讲解:代码随想录
视频讲解:组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列_哔哩哔哩_bilibili

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]; // 初始化used数组backtracing(nums);return result;}public void backtracing(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]); // 将当前数字加入路径backtracing(nums); // 递归调用path.removeLast(); // 回溯,移除最后一个数字used[i] = false; // 回溯,标记当前数字为未使用}}
}

47.全排列 II

题目链接/文章讲解:代码随想录
视频讲解:回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II_哔哩哔哩_bilibili

class Solution {List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();boolean[] used; // 用于记录哪些数字已经被使用过public List<List<Integer>> permuteUnique(int[] nums) {used = new boolean[nums.length]; // 初始化used数组Arrays.sort(nums);backtracing(nums);return result;}public void backtracing(int[] nums) {if (path.size() == nums.length) {result.add(new ArrayList<>(path)); // 添加当前路径到结果集中return;}for (int i = 0; i < nums.length; i++) {// 如果当前数字已经被使用过,或者当前数字与前一个数字相同且前一个数字未被使用过,跳过if (used[i] || (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false)) {continue;}used[i] = true; // 标记当前数字为已使用path.add(nums[i]); // 将当前数字加入路径backtracing(nums); // 递归调用path.removeLast(); // 回溯,移除最后一个数字used[i] = false; // 回溯,标记当前数字为未使用}}
}

总结

总结:代码随想录

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue Echart使用
  • 数据结构之——栈
  • 【LeetCode周赛】第 416 场
  • layui时间选择器选择周 日月季度年
  • java.nio.ByteBuffer的 capacity, limit, position, mark
  • 【计算机网络强化】计网强化笔记
  • 【计算机网络 - 基础问题】每日 3 题(二十二)
  • GP2D12红外距离传感器
  • MiniCPM3-4B | 笔记本电脑运行端侧大模型OpenBMB/MiniCPM3-4B-GPTQ-Int4量化版 | PyCharm环境
  • 分库分表-分页排序查询
  • Android开发高频面试题之——Android篇
  • 0-Mapbox简介及产品类型
  • Springboot Mybatis条件查询
  • 计算机网络 --- Socket 编程
  • 24.9.23学习笔记
  • django开发-定时任务的使用
  • extract-text-webpack-plugin用法
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript函数式编程(一)
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • session共享问题解决方案
  • Sublime text 3 3103 注册码
  • vue 个人积累(使用工具,组件)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • yii2权限控制rbac之rule详细讲解
  • 浮动相关
  • 欢迎参加第二届中国游戏开发者大会
  • 机器学习中为什么要做归一化normalization
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 聊聊flink的BlobWriter
  • 突破自己的技术思维
  • 项目管理碎碎念系列之一:干系人管理
  • 一道闭包题引发的思考
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #APPINVENTOR学习记录
  • (12)目标检测_SSD基于pytorch搭建代码
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (23)Linux的软硬连接
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (转)linux 命令大全
  • .cn根服务器被攻击之后
  • .net SqlSugarHelper
  • .NET 事件模型教程(二)
  • .net 微服务 服务保护 自动重试 Polly
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @SpringBootApplication 注解