【面试高频算法解析】算法练习2 回溯

目录

  • 前言
  • 算法解析
  • 练习题
    • 组合总和
    • 全排列II
    • 单词搜索

前言

本篇章开放目的是按算法类型学习算法,学习对应算法理论,并通过练习一些经典算法题深入理解这类算法,避免出现刷了很多算法题,还是一知半解的状态


算法解析

回溯(Backtracking)是一种通过试错来解决问题的算法思想。当它通过尝试分步去解决一个问题时,如果发现现有的分步答案不能得到有效的正确的解答时,它将取消上一步甚至是上几步的计算,再通过其他的可能的分步解答再次尝试寻找问题的答案。

回溯法通常用递归方式来实现,在解决问题的过程中尝试各种可能的分步方法。如果某一步骤失败了,回溯算法会退回到上一步骤,然后尝试另一种方法。回溯法常用于解决如下问题:

  • 组合问题:求解一个问题的所有满足条件的组合方式。
  • 排列问题:求解一个问题的所有满足条件的排列方式。
  • 划分问题:求解将一个对象分成几部分的方法。
  • 子集构造问题:求解一个集合的所有子集。
  • 棋盘问题:如八皇后问题、解数独和跳马问题等。
  • 图的遍历问题:如哈密顿路径问题、图的着色问题等。

回溯算法的关键在于解决决策树的遍历过程中,如何剪枝。剪枝通过检测是否已经不可能得到正确的解来减少不必要的计算。在实现回溯算法时,通常有以下几个步骤:

  1. 选择:选择下一个可能的分步解答。
  2. 约束:检查到目前为止的解答序列是否满足约束条件(即是否“合法”)。
  3. 目标:检查到目前为止的解答序列是否满足解答条件(即是否已经找到一个解答)。

如果以上步骤中的任何一步不能继续下去,那么就执行回溯(返回上一步),尝试其他可能的路径。这种算法可以看作穷举搜索的一种优化,它利用问题的约束条件大大减少了搜索空间。

回溯算法和深度优先搜索(DFS)有密切的关系,实际上,回溯算法可以视为带有剪枝功能的深度优先搜索。在实现时,通常使用递归方法来模拟整个决策树的深度优先遍历过程,递归结构的本质上是栈结构,与DFS的实现方式一致。


练习题

组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:
输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]

解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例 2:
输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:
输入: candidates = [2], target = 1
输出: []

提示:
1 <= candidates.length <= 30
2 <= candidates[i] <= 40
candidates 的所有元素 互不相同
1 <= target <= 40

官方题解


全排列II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]

示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10

官方题解


单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:
请添加图片描述

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true

示例 2:
请添加图片描述

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”
输出:true

示例 3:
请添加图片描述
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”
输出:false

提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 仅由大小写英文字母组成

进阶: 你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?

官方题解

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

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

相关文章

es 简单集群搭建,版本8.6.2

Node-1 配置&#xff1a; # elasticsearch.yml for Node-1cluster.name: my-test-cluster node.name: node-1 path.data: /path/to/data/node-1 path.logs: /path/to/logs/node-1 network.host: 127.0.0.1 http.port: 9200 transport.port: 9300 discovery.seed_hosts: ["…

Canal+RabbitMQ实现MySQL数据同步至ClickHouse

ClickHouse作为一个被广泛使用OLAP分析引擎&#xff0c;在执行分析查询时的速度优势很好的弥补了MySQL的不足&#xff0c;但是如何将MySQL数据同步到ClickHouse就成了用户面临的第一个问题。本文利用Canal来实现ClickHouse实时同步MySQL数据&#xff0c;使用RabbitMQ来做消息队…

FreeRTOS——计数型信号量知识总结及实战

1计数型信号量概念 1&#xff09;计数型信号量相当于队列长度大于1 的队列&#xff0c;因此计数型信号量能够容纳多个资源 2&#xff09;适用场景&#xff1a; 事件计数&#xff1a; 当每次事件发生后&#xff0c;在事件处理函数中释放计数型信号量&#xff08;计数值1&#x…

【C语言】汉诺塔问题/数据结构经典问题/详细总结讲解

1. 前言 汉诺塔问题是一个经典的递归问题&#xff0c;源于印度的一个古老传说。这个问题的特点是其独特的解决方式&#xff0c;需要将一堆盘子从一个柱子移动到另一个柱子&#xff0c;每次只能移动一个盘子&#xff0c;并且不能将一个较大的盘子放在较小的盘子上面。这个问题的…

MySQL存储引擎InnoDB和MyISAM的区别?

MySQL存储引擎InnoDB和MyISAM的区别? InnoDB和MyISAM是MySQL数据库两种常见的存储引擎&#xff0c;它们在性能、事务支持等方面有一些重要的区别。以下是它们的一些主要区别&#xff1a; 事务支持&#xff1a; InnoDB&#xff1a; 支持事务&#xff0c;具有ACID&#xff08;原…

Go语言开发IDE全面分析

Go语言开发IDE全面分析 Go语言&#xff0c;又称为Golang&#xff0c;是Google开发的一种静态类型、编译型语言&#xff0c;它具有简洁、快速、安全、并发等特点。作为一名高效的Go语言程序员&#xff0c;选择一个功能强大的集成开发环境&#xff08;IDE&#xff09;是至关重要…

在Docker中安装Tomact

目录 前言&#xff1a; 一.安装Tomact 查找指定的tomact版本 下载tomact9.0 查看该镜像是否安装成功 安装成功之后就开始运行镜像了 ps&#xff08;用于列出正在运行的Docker容器&#xff09; ​编辑 测试(虚拟机ip:8080) ​编辑 解决措施 ​编辑 完成以上步骤&…

如何将本文中的表情符号,使用正则表达式pattern,匹配并替换

如下面的文本: xxxxx \uD83E\uDD1F xxxxx 🤟 xxxxx \uD83E\uDD1Fxxxxx 🤟如何替换这些特殊的unicode呢? 我们先学习下常见的正则: 基本的 Unicode 属性分类 \p{L}|\p{Letter} 字母 \p{M}|\p{Mark

技术学习|CDA level I 描述性统计分析(统计学概述)

统计学是一门收集、处理、分析、解释数据&#xff0c;并从中得出结论的科学。 研究思路&#xff1a;收集数据——>处理数据——>分析数据——>解释数据 收集数据是数据分析的前提&#xff0c;传统的数据收集方法包括两个来源&#xff1a;直接来源和间接来源&#xff…

LabVIEW在高精度机器人视觉定位系统中的应用

在现代工业自动化中&#xff0c;精确的机器人视觉定位系统对于提高生产效率和产品质量至关重要。LabVIEW软件&#xff0c;以其卓越的图像处理和自动化控制功能&#xff0c;在这一领域发挥着重要作用。本案例将展示LabVIEW如何帮助开发和实现一个高精度的机器人视觉定位系统&…

有什么安全处理方案可以有效防护恶意爬虫

常见的爬虫 有百度爬虫、谷歌爬虫、必应爬虫等搜索引擎类爬虫&#xff0c;此类爬虫经常被企业用于提高站点在搜索引擎内的自然排名&#xff0c;使得站点在各大搜索引擎中的排名能够提高&#xff0c;进一步通过搜索引擎来进行引流为企业增加业务流量。 恶意爬虫与合法、合规的搜…

Web自动化测试框架总结

实施过了web系统的UI自动化&#xff0c;回顾梳理下&#xff0c;想到什么写什么&#xff0c;随时补充。 首先&#xff0c;自动化测试不是手动测试的替代品&#xff0c;是比较好的补充&#xff0c;而且不是占大比重的补充。 70%的测试工作集中在底层接口测试和单元测试&#xff0…

多元统计分析(4):判别分析

4.1 判别分析的目标 主要目的&#xff1a;判别一个个体所属类别 4.2 距离判别 都选用用马氏距离 4.2.1 判别准则 化简的证明&#xff1a; 称为判别函数&#xff0c;为判别系数。 4.2.2 误判概率 【1】当两个正态总体的协方差相同 证明&#xff1a; 当两个正态总体重合的时…

uniapp中组件库丰富的Switch 开关选择器使用方法

目录 #平台差异说明 #基础使用 #加载中 #禁用switch #自定义尺寸 #自定义颜色 #自定义样式 #异步控制 API #Switch Props #Switch Event 选择开关用于在打开和关闭状态之间进行切换。 #平台差异说明 App&#xff08;vue&#xff09;App&#xff08;nvue&#xff0…

学生公寓安全用电管理系统应用案例

摘要&#xff1a;安全用电是学校公寓用电管理的首要任务&#xff0c;这就需要对一些恶性负载进行识别和控制&#xff0c;同时为了减少电工和后期管理人员的成本&#xff0c;引进了安全用电管理系统。本文在在描述了安全用电管理系统的工作原理和利用智能电表可实现的功能后,阐明…

数字信号处理期末复习——基础知识汇总(三)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

基于ssm的小儿肺炎知识管理系统设计与实现+vue论文

小儿肺炎知识管理系统设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理模式…

单机多进程,每个进程多张卡 mpi nccl 程序设计检验

做了部分注释&#xff0c;比较乱 本示例结构&#xff1a; 1&#xff0c;源代码 #include <stdlib.h> #include <stdio.h> #include "cuda_runtime.h" #include "nccl.h" #include "mpi.h" #include <unistd.h> #include <…

网络安全—模拟IP代理隐藏身份

文章目录 网络拓扑安装使用代理服务器设置隐藏者设置 使用古老的ccproxy实现代理服务器&#xff0c;仅做实验用途&#xff0c;禁止做违法犯罪的事情&#xff0c;后果自负。 网络拓扑 均使用Windows Server 2003系统 Router 外网IP&#xff1a;使用NAT模式 IP DHCP自动分配或者…

【单调栈】739.每日温度

题目 法1&#xff1a;典型单调栈问题 class Solution {public int[] dailyTemperatures(int[] temperatures) {int n temperatures.length;int[] res new int[n];Stack<Integer> stack new Stack<>();for (int i n - 1; i > 0; --i) {while (!stack.isEmp…