【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.代码…

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;微信分销商城小程序开发定制的价格究竟是多少呢&#xff1f;这个问题需要从多个方面来加以考虑。首先&#xf…

鸿蒙视频播放的实现

文章目录 前言播放效果视频播放的实现总结 一、前言 现在市面上很多应用都跟视频有关&#xff0c;那么在鸿蒙系统上怎么来播放视频呢&#xff0c;今天就讲解视频播放控件&#xff0c;让你也能快速地进行视频播放功能开发。 最后呢&#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;还是有必要聊一聊这个话题。 首先这个问题并不严谨&…

DeePhage:预测噬菌体的生活方式

GitHub - shufangwu/DeePhage: A tool for distinguish temperate phage-derived and virulent phage-derived sequence in metavirome data using deep learning 安装 conda create -n deephage conda activate deephage pip install numpy pip install h5py pip install ten…

Spring Security入门教程:利用Spring Security实现安全控制

在现今这个数码大展拳脚的时代&#xff0c;安全问题无疑是咱们这些搞软件开发的人需要谨慎应对的一块烫手山芋&#xff0c;无论是那些大型企业应用&#xff0c;还是那种小打小闹的个人项目&#xff0c;对我们宝贵的数据和服务的保护都显得尤为关键。 试想一下&#xff0c;若是…

Java代码基础算法练习-求数据序列的最大值及最小值---2024.3.15

题目 任务描述&#xff1a;输入n个整数&#xff0c;求n个整数的最大值及最小值&#xff0c;并输出相应的位置序号。&#xff08;注&#xff1a;n<10&#xff0c; 位置序号从1开始计算&#xff0c;若存在多个相同值的情形&#xff0c;则输出第1个值的序号&#xff09; 任务要…

PTA题解 --- 求整数段和(C语言)

今天是PTA题库解法讲解的第二天&#xff0c;接下来讲解求整数段和&#xff0c;题目如下&#xff1a; 为了解决这个问题&#xff0c;你可以遵循以下的思路&#xff1a; 1. 读取输入的两个整数A和B。 2. 使用一个for循环&#xff0c;从A遍历到B。 3. 在循环中&#xff0c;打印当…

试卷上的水印如何去除?分享3种常用的方法!

在日常生活和工作中&#xff0c;我们经常会遇到一些带有水印的试卷或文档&#xff0c;这些水印不仅影响了我们的阅读体验&#xff0c;还可能对我们的工作和学习产生一定的困扰。那么&#xff0c;如何有效去除试卷上的水印呢&#xff1f;今天&#xff0c;就让我们一起来探讨这个…

渗透测试实战思路分析

免责声明&#xff1a;文章来源真实渗透测试&#xff0c;已获得授权&#xff0c;且关键信息已经打码处理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人…

Liunx下安装Redis(详细安装)

1、创建一个文件目录 mkdir /opt/redis2、进入安装目录 cd /opt/redis3、下载redis默认安装包 默认是3.0版本的 wget http://download.redis.io/releases/redis4、进行解压 tar -xzvf redis-3.0.7.tar.gz5、进入解压好的文件夹目录 cd redis-3.0.7 6、将redis重新安装到 …

Python面向对象构造函数:手把手教你如何玩转对象初始化

我们都知道&#xff0c;Python是一个面向对象的语言&#xff0c;这意味着我们可以用类来定义对象的属性和方法。而构造函数&#xff0c;就是当我们创建一个新的对象时&#xff0c;会自动调用的特殊方法。那么&#xff0c;如何玩转这个构造函数呢&#xff1f; 首先&#xff0c;…