【LeetCode】升级打怪之路 Day 24:回溯算法的解题框架

今日题目:

  • 46. 全排列
  • 51. N 皇后
  • 78. 子集

目录

      • LC 46. 全排列
      • LC 51. N 皇后
      • LC 78. 子集 【classic】
        • 1)思路一
        • 2)思路二

今天学习了回溯算法的解题框架:回溯算法解题套路框架 | labuladong

回溯算法的整体框架都是:

result = []def backtrack(路径, 选择列表):if 满足结束条件:result.add(路径)returnfor 选择 in 选择列表:做选择backtrack(路径, 选择列表)撤销选择

基本上所有使用回溯算法来解题时都是这个思路,区别就在于要根据具体题目背景来设计“选择列表”有什么、如何做出选择等等

在我们做题时,简单画一下回溯算法的决策树能够快速帮助我们如何设计“遍历选择列表”、“做选择”等这些操作。可以参考这篇文章的 LC 78 题目。

LC 46. 全排列

46. 全排列

学会回溯算法的思路后,这个题目就不难了,看看解题框架是如何运用到这个题目中的:

class Solution {private List<List<Integer>> result;private void backtrack(List<Integer> path, int[] nums, boolean[] used) {// 加入结果集if (path.size() == nums.length) {result.add(new ArrayList<>(path));}// 遍历选择for (int i = 0; i < nums.length; i++) {if (used[i]) {continue;}// 做出选择used[i] = true;int num = nums[i];path.addLast(num);backtrack(path, nums, used);// 撤销选择used[i] = false;path.removeLast();}}public List<List<Integer>> permute(int[] nums) {result = new ArrayList<>();List<Integer> path = new ArrayList<>();boolean[] used = new boolean[nums.length];Arrays.fill(used, false);backtrack(path, nums, used);return result;}
}

LC 51. N 皇后

51. N 皇后

这也是经典的使用回溯来解题的题目:每一次在新的一行中选出一列放上棋子,直到 n 行都放上棋子后就可以作为一种答案。

这个题目在使用回溯算法时,关键难点在于如何判断在做出一个选择后的棋局是否满足 N 皇后要求。因为我们是每次在新的一行中放入棋子,所以只需要检测这个新的棋子是否存在列冲突以及斜线冲突。

按照以上思路,题目也就不难了。

LC 78. 子集 【classic】

78. 子集

这个题目有两种思路来画回溯算法的决策树:

1)思路一

在这里插入图片描述

每一次做选择时,是从当前节点元素在 nums 后面的元素中选一个加入到路径中。在遍历这个决策树时,每一步都将其加入到结果集中,就可以得到所有的子集了。

2)思路二

决策树的第 i 层所做的选择是:nums[i] 是否使用。然后叶子节点就对应了一个结果集中的答案。决策树如下:

在这里插入图片描述

这里看一下两种思路的代码:

  • 思路一代码:
class Solution {private List<List<Integer>> result;private static List<Boolean> choices = List.of(false, true);private void backtrace(List<Integer> path, int[] nums, int start) {result.add(new ArrayList<>(path));for (int i = start; i < nums.length; i++) {path.addLast(nums[i]);backtrace(path, nums, i + 1);path.removeLast();}}public List<List<Integer>> subsets(int[] nums) {result = new ArrayList<>();backtrace(new ArrayList<>(), nums, 0);return result;}
}
  • 思路二代码:
class Solution {private List<List<Integer>> result;private static List<Boolean> choices = List.of(false, true);private void backtrace(List<Integer> path, int[] nums, int level) {if (level == nums.length) {result.add(new ArrayList<>(path));return;}// 遍历选择列表for (var choice: choices) {int num = nums[level];if (choice) {path.addLast(num);backtrace(path, nums, level + 1);path.removeLast();} else {backtrace(path, nums, level + 1);}}}public List<List<Integer>> subsets(int[] nums) {result = new ArrayList<>();if (nums.length == 0) {return List.of(Collections.emptyList());}backtrace(new ArrayList<>(), nums, 0);return result;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣L11--- 344.反转字符串(JAVA版)-2024年3月15日

1.题目 2.知识点 交换两个变量值的代码 char temps[left];//temp为暂时的变量&#xff0c;left是左指针&#xff0c;将left暂时存储在temp里面s[left]s[right];//将右指针的值赋给左指针s[right]temp;//将temp的值给右指针left;//左指针向左移动right--;//右指针向右移动3.代码…

Nginx高级技术: 地址重写 Rewrite和应用场景

一、rewrite 场景示例说明 1、基于客户端指定 IP 访问跳转 应用场景说明&#xff1a;指定的 IP地址能正常访问192.168.179.10访问正常。 Rewrite配置如下&#xff1a; vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name www.old.com; …

【嵌入式DIY实例】-最大功率点跟踪 (MPPT) 太阳能充电控制器

最大功率点跟踪 (MPPT) 太阳能充电控制器 文章目录 最大功率点跟踪 (MPPT) 太阳能充电控制器1、应用介绍2、硬件准备3、太阳能充电控制器介绍4、硬件设计5、驱动代码实现1、应用介绍 在这个应用中,我们将使用 Arduino 并结合许多主动-被动电子设备构建我们自己的 MPPT 太阳能…

2024年【广东省安全员C证第四批(专职安全生产管理人员)】考试总结及广东省安全员C证第四批(专职安全生产管理人员)模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;考试总结是安全生产模拟考试一点通总题库中生成的一套广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;模拟试题&#xff0c;…

【ShenYu源码阅读】支持提醒通知设计,来看看开源贡献者都做了什么

相信大家碰到源码时经常无从下手&#x1f643;&#xff0c;不知道从哪开始阅读&#xff0c;面对大量代码晕头转向&#xff0c;索性就读不下去了&#xff0c;又浪费了一次提升自己的机会&#x1f62d;。 我认为有一种方法&#xff0c;可以解决大家的困扰&#xff01;那就是通过阅…

修复ElementUI中el-select与el-option无法通过v-model实现数据双向绑定的问题

1. 问题描述 需求&#xff1a;在使用ElementUI时&#xff0c;通过el-select和el-option标签实现下拉列表功能&#xff0c;当el-option中的选项被选中时&#xff0c;被选中的选项可以正确回显到已选择的列表中。 对于上面的下拉列表&#xff0c;当我们选中“超级管理员”的选项…

跨境电商应该用什么样的服务器?多大带宽?

跨境电商在选择服务器 和带宽时&#xff0c;需要考虑多个因素&#xff0c;包括业务规模、用户数量、网站流量、地理位置等。下面是一些关键考虑因素&#xff1a; 1、服务器类型 跨境电商通常会选择使用云服务器&#xff0c;因为云服务器具有灵活性、可扩展性和高可用性。云服务…

中国人民银行修订发布《征信投诉办理规程》

近年来&#xff0c;我国征信市场快速发展,征信业务覆盖主体持续增多、征信服务应用场景日益多元&#xff0c;征信权益保护工作面临新形势新任务。为更好地保障信息主体合法权益&#xff0c;推动我国征信业高质量发展&#xff0c;近日&#xff0c;中国人民银行修订发布《征信投诉…

算法训练营day48,动态规划16

package main func max(a, b int) int { if a > b { return a } return b } //647. 回文子串 func countSubstrings(s string) int { n : len(s) dp : make([][]bool, n) for i : 0; i < n; i { dp[i] make([]bool, n) } num : 0 for i : n - 1; i > 0; i-- { for…

SpringBoot原理解析

目录 依赖管理父项目依赖starter场景启动器 自动配置 Bean 和Component 的区别&#xff1a; 容器功能注解 简化开发web场景开发请求处理响应请求 thymeleaf视图解析原理流程 HandlerInterceptor拦截器文件上传异常处理错误处理默认规则定制错误处理逻辑异常处理自动配置异常处理…

微信分销商城小程序开发定制价格解析

在互联网时代&#xff0c;电子商务的飞速发展使得微信分销商城小程序成为消费者购物体验的一大利器&#xff0c;同时也为企业带来了更多的商业机遇。那么&#xff0c;微信分销商城小程序开发定制的价格究竟是多少呢&#xff1f;这个问题需要从多个方面来加以考虑。首先&#xf…

代码随想录|Day20|二叉树09|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 思路&#xff1a;利用二叉搜索树的性质&#xff0c;对于每个节点&#xff0c;判断其是否在区间内&#xff1a; 如果节点值 < low&#xff0c;则此节点和其左子树都不在范围内如果节点值 > high&#xff0c;则此节点和其右子树都不在范围内如果 low &…

MySQL 相关英文单词

1、database[deɪtəbeɪs] n. 数据库&#xff0c;资料库 2、net[net] 网络 3、start[stɑ:t] vt. 开始&#xff1b;启动 4、stop[stɒp] vi. 停止&#xff1b;中止&#xff1b;n. 停止&#xff1b;车站 5、root[ru:t] 根&#xff0c;MySQL 的超级管理员的用户名 6、…

鸿蒙视频播放的实现

文章目录 前言播放效果视频播放的实现总结 一、前言 现在市面上很多应用都跟视频有关&#xff0c;那么在鸿蒙系统上怎么来播放视频呢&#xff0c;今天就讲解视频播放控件&#xff0c;让你也能快速地进行视频播放功能开发。 最后呢&#xff0c;我会提供一个鸿蒙中涉及的主要…

2024年华为OD机试真题-任务处理-Java-OD统一考试(C卷)

题目描述: 在某个项目中有多个任务(用 tasks 数组表示)需要您进行处理,其中 tasks[i] = [si, ei],你可以在 si <= day <= ei 中的任意一天处理该任务。请返回你可以处理的最大任务数。 注:一天可以完成一个任务的处理。 输入描述: 第一行为任务数量 n,1 <= n …

二刷代码随想录——动态规划day47

文章目录 前言动态规知识点 动规五部曲一、198. 打家劫舍二、213. 打家劫舍 II三、337. 打家劫舍 III总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0c;于是参加了卡子…

元函数与运行期(普通)函数的区别,为什么要用元函数?

看以下面代码你就知道了&#xff1a; /// <summary> /// 求整数所对应的二进制表示中1的个数 /// </summary> /// <typeparam name"Input"></typeparam> /// 创建时间&#xff1a;2024-01-24 抄自&#xff1a;《动手打造深度学习框架》 21…

深度学习模型部署(十)模型部署配套工具二

上篇blog讲了trtexec和onnx_graphsurgeon两个工具&#xff0c;一个用于将onnx转化为trt模型&#xff0c;另一个用于对onnx模型进行修改。这篇blog讲polygraphy和nsight systems&#xff0c;前者用于进行模型优化以及结果验证&#xff0c;后者用于性能分析。 polygraph polygra…

️ 亲身体验!探索工业界最前沿的安全帽数据集,你的工作安全靠它保驾护航!

一、SHWD安全帽佩戴检测数据集&#xff08;Safety helmet (hardhat) wearing detect dataset&#xff09; 介绍 SHWD 提供了用于安全头盔佩戴和人头检测的数据集。它包括7581张图像&#xff0c;其中9044个人体安全头盔佩戴对象&#xff08;正面&#xff09;和111514个正常头部…

渐开线花键不是齿轮?

在和一位小伙伴交流时&#xff0c;他认为齿轮和花键不一样&#xff0c;那花键是不是齿轮呢&#xff1f;老师傅们可以绕开了&#xff0c;我觉得对于一些平时接刚刚接触齿轮&#xff0c;或者很少接触的朋友来说&#xff0c;还是有必要聊一聊这个话题。 首先这个问题并不严谨&…