
数据结构与算法
文章平均质量分 82
主要介绍包括表、栈、队列、树、散列表、优先队列、排序、不相交集算法、图论算法、算法分析、算法设计、摊还分析、查找树算法、k-d树和配对堆等数据结构和算法解析。并分享诸多的算法题目的详细讲解、思路分析以及算法的展示示例,快速掌握算法的诸多技巧和提升算法的实战能力。
╰つ栺尖篴夢ゞ
本人毕业于计算机技术专业,从事iOS高级开发,专注于iOS/MacOS内核/汇编/源码/架构/算法等相关技术的开发学习,同时热爱人工智能、OpenGL/ES、云原生等技术,优快云博客专家与原力计划作者,华为云云享专家与特约博主,阿里云专家博主,荣获优快云 iOS领域优质创作者、2022年度博客之星移动领域TOP 3、2022年度博客之星TOP 16、AI创想秀邂逅“华为云ModelArts”征文大赛一等奖、优快云第一届猿创征文优质博文奖,以及多项优秀TOP博文、优快云开源挑战赛优秀奖等。
展开
-
【数据结构与算法】之线性表的应用和操作
数据结构概念数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。数据结构的逻辑结构:数据对象中数据元素之间的相互关系,分为线性结构、树形结构、图形结构以及集合结构。数据结构的物理结构:数据的逻辑结构在计算机中的存储形式,分为顺序存储和链式存储(不连续存储)。算法:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。算法五个基本特性:输入、输出、有穷性、确定性和可行性。算法时间复杂度O(n):常数阶、线性阶、平方阶、对数阶、立方阶、nlogn阶、指原创 2020-07-21 22:58:15 · 1179 阅读 · 2 评论 -
【数据结构与算法】之链表的操作和使用
链表的定义链表:由一系列结点(链表中每一个元素称为结点)组成,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。链表这种存储方式,其元素个数是不受限定的,当进行添加元素的时候存储的个数就会随之改变。链表和数组的优缺点对比:数据形式优点缺点链表运行时确定大小,快速插入和删除元素不能随机访问,用户必须提供编程支持数组C直接支持,提供随机访问在编译时确定大小,插入和删除元素很费时在链表中有一个头指针变量,这个指针变量保原创 2020-07-22 18:25:17 · 452 阅读 · 1 评论 -
【数据结构与算法】之栈与队列的应用和操作
栈概念栈:限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端为栈顶,另一端是栈底。性质:栈是一种LIFO(Last In First Out)的线性表,也就是数据元素遵循后进先出的原则。栈的抽象数据类型:ADT 栈(Stack)Data 具有线性表一样的性质。Operation top:获取栈顶元素 count:栈的长度 isEmpty:栈内元素是否为空 push(data):元素进栈 pop():元素出栈原创 2020-07-22 15:05:29 · 1190 阅读 · 1 评论 -
【数据结构与算法】之树的概念与使用
什么是树?一、概念树:n(n>=0)个结点的有限集。二、特点n=0时,称为空树;在任意一颗非空树中:① 有且仅有一个根结点② 当n>1时,其余结点可分为m(m>0)个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树。三、结点分类结点拥有的子树数称为结点的度(Degree);度为0的结点称为叶结点(Leaf) 或 终端结点;度不为0的结点称为非终端结点 或 分支结点;除根节点之外,分支结点也称为内部结点;树的度是树内结点的度的最大值。四原创 2020-07-24 15:35:57 · 417 阅读 · 1 评论 -
【数据结构与算法】之单向循环链表的创建/遍历/插⼊/查找/删除算法实现
循环链表是一个收尾相接的链表,将单链表的最后一个指针域改由NULL改为指向表头结点这就是单链式的循环链表,并称为循环单链表。带头结点的循环单链表的各种操作的算法实现与带头结点单链表的算法实现类似,差别仅在于算法判别当前结点p是否为尾结点的条件不同。单链表中的判别条件为p!=NULL或p->next!=NULL,而单循环链表判别条件是p!=L或p->next!=L。在循环单链表中附设尾指针有时候比附设头指针更简单。原创 2020-08-06 02:52:09 · 1367 阅读 · 1 评论 -
【数据结构与算法】之双向链表的创建/遍历/插入/删除/查找的算法实现
双向链表是数据结构中重要的结构,也是线性结构中常用的数据结构,双向指针,方便用户从首结点开始沿指针链向后依次遍历每一个结点,结点的前驱和后继查找方便。其实双向链表和单向链表也是有很多相似的地方的,每个节点都包含两个指针,一个指针指向上一个节点,一个指针指向下一个节点。两个特殊的地方,第一就是头节点的一个指针指向NULL空指针(没有前驱节点),第二就是尾节点的一个指针指向NULL指针(没有后继节点)。原创 2020-08-06 17:56:09 · 1047 阅读 · 1 评论 -
【数据结构与算法】之深入解析二叉树的算法实现和递归套路深度实践
一、二叉树的遍历二叉树节点定义: Class Node { // 节点的值类型 V value; // 二叉树的左孩子指针 Node left; // 二叉树的右孩子指针 Node right; }递归实现先序中序后序遍历:先序:任何子树的处理顺序都是,先头结点,再左子树,再右子树,先处理头结点;中序:任何子树的处理顺序都是,先左子树,再头结点,再右子树,中间处理头结点;原创 2021-08-19 00:02:16 · 2332 阅读 · 1 评论 -
【数据结构与算法】之深入解析十大常用排序算法的原理分析和算法实现
排序算法的对比排序算法平均时间复杂度最好情况最坏情况空间复杂度排序方式稳定性冒泡排序O(n2)O(n)O(n2)O(1)In-place稳定选择排序O(n2)O(n2)O(n2)O(1)In-place不稳定插入排序O(n2)O(n)O(n2)O(1)In-place稳定希尔排序O(n logn)O(n log2n)O(n log2n)O(1)In-place不稳定归并排序O(n logn)O(n l原创 2020-07-26 16:48:10 · 331 阅读 · 1 评论 -
【数据结构与算法】之深入解析常用的五大算法设计策略
一、分治① 基本思想在计算机科学中,分治法是一种很重要的算法,字面上的解释是“分而治之”,就是将一个难以直接解决的大问题,分割成 n 个规模较小的子问题,这些子问题相互独立,且与原问题相同,然后各个击破,分而治之。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等。能用分治法的基本特征:问题缩小到一定规模容易解决;分解成的子问题是相同种类的子问题,即该问题具有最优子结构性质(递归思想);分解而成的小问题在解决之后要可以合并;原创 2021-10-20 20:52:07 · 38936 阅读 · 39 评论 -
【数据结构与算法】之面试必考的“二分算法”系统梳理
一、整数二分整数二分说明整数二分即为在整数集合上的二分,常见的用法有:在单调序列中查找「某个数是否出现过」、「某个数最早出现的位置」以及「>= 某个数中最小的数」等。解决这类问题的思想非常统一,即对坐标区间不断进行折半,以此在 O(log(n)) 的时间复杂度内确定答案,但其「实现方法」却非常多样,由此导致很多同学在此类问题上出错。因此接下来将通过一个例题来介绍「记录 ans」的二分实现方法,该方法较易理解且不易出错。整数二分示例在排序数组中查找元素的第一个和最后一个位置。① 题目说原创 2021-03-04 04:06:53 · 342 阅读 · 5 评论 -
【数据结构与算法】之深入解析“贪心算法“的原理解析和算法实现
一、简介① 贪心算法的基本概念贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解,它是最自然智慧的算法。贪心算法用一种局部最功利的标准,总是能做出在当前看来是最好的选择,难点在于证明局部最优解最功利的标准可以得到全局最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。需要注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性(即某个状态以后的过程不会影响以前的状态,只与原创 2021-08-18 16:12:46 · 5594 阅读 · 2 评论 -
【数据结构与算法】之深入解析KMP算法的核心原理和实战演练
一、简介① 概念KMP 算法是一种改进的字符串匹配算法,由 D.E.Knuth,J.H.Morris 和 V.R.Pratt 提出的,因此人们称它为克努特—莫里斯—普拉特操作,简称 KMP 算法。KMP 算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个 next() 函数实现,函数本身包含了模式串的局部匹配信息。KMP 算法的时间复杂度 O(m+n) [1] 。KMP 算法是三位学者在 Brute-Force 算法的基础上同时提出的模式匹原创 2021-08-19 19:39:46 · 12053 阅读 · 23 评论 -
【数据结构与算法】之深入解析RSA加密算法的实现原理
一、密码学历史密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截狱情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表,这样,如果不知道密码本,即使截获一段信息也看不懂。从凯撒大帝时代到上世纪70年代这段很长的时间里,密码学的发展非常的缓慢,因为设计者基本上靠经验,没有运用数学原理。1976 年以前,所有的加密方法都是同一种模式:甲方选择某一种加密规则(简称密钥),对信息进行加密;乙方使用同一种规则,对信息进行解密。由于加密和解密使原创 2021-09-05 20:36:18 · 3649 阅读 · 1 评论 -
【数据结构与算法】之深入解析Base64编码的实现原理
一、Base64 编码简介① Base64 编码的由来为什么会有 Base64 编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像 ASCII 码的控制字符就不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就无法传送。最好的方法就是在不改变传统协议的情况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示,问题就可以解决。Base64 编码应运而生,Base64 就是一种基于 64 个原创 2021-09-11 14:04:26 · 2461 阅读 · 1 评论 -
【数据结构与算法】之深入解析图的拓扑排序
一、拓扑排序简介① 什么是有向无环图?一个无环的有向图称为有向无环图(Directed Acycline Graph),简称 DAG 图,如下所示:图中最左边的是有向树,中间的是有向无环图,最右则的是有向图(因为 BED 三个顶点之间构成一个有向环,ACEB 也存在环路)。② 什么是 “活动” ?所有的工程或者某种流程都可以分为若干个小的工程或者阶段,我们称这些小的工程或阶段为“活动”。打个比方,如何把一只大象装到冰箱里,很简单,分三步:第一,打开冰箱门;第二,将大象原创 2021-10-14 21:00:04 · 25566 阅读 · 19 评论 -
【数据结构与算法】之判断字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。一、题目要求示例 一: 输入: s = "leetcode" 输出: false 示例 二: 输入: s = "abc" 输出: true限制: 0 <= len(s) <= 100二、 算法示例实现示例:遍历字符串,每次遍历去除首字母,然后查询剩余字符串里是否有去除掉的这个首字母; func isUnique(_ astr: String) -> Bool { var原创 2020-09-16 23:22:26 · 371 阅读 · 0 评论 -
【数据结构与算法】之判断是否互为字符重排
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。一、题目要求示例一: 输入: s1 = "abc", s2 = "bca" 输出: true 示例二: 输入: s1 = "abc", s2 = "bad" 输出: false说明: 0 <= len(s1) <= 100 0 <= len(s2) <= 100二、算法示例先重排,再比较Swift func CheckPermutat原创 2020-09-17 00:15:12 · 440 阅读 · 1 评论 -
【数据结构与算法】之N个数中有K个数可能的组合算法
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。一、题目要求 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]二、算法示例Swift var res = [[Int]]() func bt(_ n:Int, _ count:Int, _ t:[Int]){ let tLen = t.count if tLe原创 2020-09-17 00:42:23 · 878 阅读 · 0 评论 -
【数据结构与算法】之电话号码键盘的字母组合算法
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。一、题目要求给出数字到字母的映射如下(与电话按键相同)。注意: 1 不对应任何字母。示例如下: 输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。二、算法示例思路解决这个问题的思路比较简单,字符串每一个数字对于有多种字母, 比如 2 对应: abc 3原创 2020-09-18 00:05:45 · 395 阅读 · 0 评论 -
【数据结构与算法】之容器盛最多水的算法实现
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:不能倾斜容器,且 n 的值至少为 2。一、题目要求图中垂直线代表输入数组 [1, 8, 6, 2, 5, 4, 8, 3, 7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例 输入:[1,8,6,2,5,4,8,3,7]原创 2020-09-21 18:06:16 · 298 阅读 · 0 评论 -
【数据结构与算法】之判断一个整数是否是 4 的幂次方的高逼格算法
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。一、题目要求示例一: 输入: 16 输出: true示例二: 输入: 5 输出: false进阶:你能不使用循环或者递归来完成本题算法吗?二、算法示例...原创 2020-09-24 23:53:02 · 579 阅读 · 0 评论 -
【数据结构与算法】之有序数组中的单一元素的算法
一、题目要求给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。示例一: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2示例二: 输入: [3,3,7,7,10,11,11] 输出: 10注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。二、示例算法① 暴力法:线性搜索可以使用线性搜索来检查数组中的每个元素,直到找到单个元素。算法:从第一个元素开始,检查每个第二个元素是否与当前元素相同原创 2020-09-28 17:23:21 · 506 阅读 · 1 评论 -
【数据结构与算法】之柱状图中最大矩形的求解思路和算法示例
一、题目要求给定 n 个非负整数,用来表示柱状图中各个柱子的高度,并且每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以下是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。如下:示例: 输入: [2,1,5,6,2,3] 输出: 10二、示例算法解题思路为什么要找左右两边高度大于当前遍历的高度的下标?因为只有高度大于当前高度,面积才有可能更大,原创 2020-10-04 00:08:41 · 1486 阅读 · 3 评论 -
【数据结构与算法】之组成和的完全平方数最少个数的求解思路与算法示例
一、题目要求给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例一 输入: n = 12 输出: 3 解释: 12 = 4 + 4 + 4示例二 输入: n = 13 输出: 2 解释: 13 = 4 + 9二、示例算法① 暴力枚举法 [超出时间限制]这个问题要求我们找出由完全平方数组合成给定数字的最小个数。我们将问题重新表述成:给定一个完全平方数列表和正整数 n,求出完全平方数组原创 2020-10-21 04:16:15 · 857 阅读 · 2 评论 -
【数据结构与算法】之有关“跳跃游戏”的求解思路与示例算法
一、跳跃游戏 I① 题目要求给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例一: 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例二: 输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不原创 2020-10-24 00:13:13 · 394 阅读 · 0 评论 -
【数据结构与算法】之连通网络的操作次数的算法
一、题目要求用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。示例一:原创 2020-10-24 22:32:47 · 548 阅读 · 3 评论 -
【数据结构与算法】之给Nx3网格图涂色的方案数的求解算法
一、题目要求你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就是有相同水平边或者垂直边的格子颜色不同)。给你网格图的行数 n ,请返回给 grid 涂色的方案数。由于答案可能会非常大,请返回答案对 109 + 7 取余的结果。示例一: 输入:n = 1 输出:12 解释:总共有 12 种可行的方法示例二: 输入:n = 2 输出:54示例三: 输入:n = 3 输出:246示例四:原创 2020-10-28 22:53:00 · 958 阅读 · 0 评论 -
【数据结构与算法】之“接雨水”的算法求解
题目要求给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height = [4,2,0,3,2,5] 输出:9提示:n == height.length0 &l原创 2020-11-30 20:08:15 · 534 阅读 · 0 评论 -
【数据结构与算法】之重复的DNA序列的算法求解
一、题目要求所有 DNA 都由一系列缩写为 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。示例一: 输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出:["AAAAACCCCC","CCCCCAAAAA"]示例二: 输入:s = "AAAAA原创 2020-12-27 04:48:31 · 748 阅读 · 0 评论 -
【数据结构与算法】之旋转图像的求解算法
一、题目描述给定一个 n × n 的二维矩阵 matrix 表示一个图像,请将图像顺时针旋转 90 度。必须在原地旋转图像,这意味着需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例一: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]示例二: 输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]] 输出:[[15,原创 2021-08-02 20:22:46 · 3950 阅读 · 0 评论 -
【数据结构与算法】之深入解析如何确定单链表有环并求环的入口和长度
一、检测单链表中存在环① 环的定义单链表中结点都是一个结点指向下一个结点这样一个一个链接起来的,直到尾结点的指针域没有指向,单链表就到此结束。链表有环的定义是,链表的尾结点的指针域并为空,指向了链接中间的某个结点,这样就形成环,遍历单链表就会死循环,这是因为破坏了结束条件。如下所示:如果单链表有环,则在遍历时,在通过结点 J 之后,会重新回到结点 D:② 快慢指针检测设两个工作指针,一个快一个慢,如果有环的话,它们会必然在某点相遇。算法的思想是:设定使用两个指针,fast 与 slow原创 2021-08-19 13:23:08 · 5473 阅读 · 3 评论 -
【数据结构与算法】之深入解析“复制带随机指针的链表”的求解思路与算法示例
一、题目① 题目描述给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝,深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random -> Y原创 2021-08-25 16:08:19 · 6650 阅读 · 0 评论 -
【数据结构与算法】之深入解析“打家劫舍”的求解思路与算法示例
假设你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。一、题目要求示例一 输入:[1,2,3,1] 输出:4 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。原创 2020-09-19 01:38:24 · 564 阅读 · 6 评论 -
【数据结构与算法】之深入解析“打家劫舍II”的求解思路与算法示例
一、题目要求你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金,这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,今晚能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他原创 2022-03-02 18:36:29 · 681 阅读 · 0 评论 -
【数据结构与算法】之深入解析“打家劫舍III”的求解思路与算法示例
一、题目要求小偷又发现了一个新的可行窃的地区,这个地区只有一个入口,我们称之为 root。除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。给定二叉树的 root,返回在不触动警报的情况下,小偷能够盗取的最高金额。示例 1:输入: root = [3,2,3,null,3,null,1]输出: 7 解释: 小偷一晚能够盗取的最高金额 3 +原创 2022-03-02 19:02:17 · 690 阅读 · 0 评论 -
【数据结构与算法】之深入解析“N个数全排列”的求解思路与算法示例
一、全排列 I① 题目描述给定一个不含重复数字,数组长度为 N 的数组 nums ,返回其所有可能的全排列,可以按任意顺序返回结果。示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:输入:nums = [0,1]输出:[[0,1],[1,0]]示例 3:输入:nums = [1]输出:[[1]]② 算法分析采用分治法把大问题分解成很多的子问题。大问题是所原创 2021-10-28 20:24:36 · 1340 阅读 · 0 评论 -
【数据结构与算法】之深入解析“汉诺塔问题”的求解思路与算法示例
一、题目描述有 A,B,C 三根柱子,A 上面有 n 个盘子,想把 A 上面的盘子移动到 C 上,但是要满足以下三个条件:每次只能移动一个盘子;盘子只能从柱子顶端滑出移到下一根柱子;盘子只能叠在比它大的盘子上。请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。需要原地修改栈。示例 1:输入:A = [2, 1, 0], B = [], C = []输出:C = [2, 1, 0]示例 2:输入:A = [1, 0], B = [], C =原创 2021-10-28 20:50:18 · 989 阅读 · 4 评论 -
【数据结构与算法】之深入解析“整数转罗马数字”的求解思路与算法示例
一、题目描述罗马数字包含以下七种字符: I, V, X, L,C,D 和 M:字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1;12 写做 XII ,即为 X + II;27 写做 XXVII, 即为 XX + V +原创 2021-12-21 20:26:30 · 487 阅读 · 0 评论 -
【数据结构与算法】之深入解析“罗马数字转整数”的求解思路与算法示例
一、题目描述罗马数字包含以下七种字符:I, V, X, L,C,D 和 M:字符数值I1V5X10L50C100D500M1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 ;12 写做 XII ,即为 X + II ;27 写做 XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,原创 2021-12-21 20:52:08 · 525 阅读 · 0 评论 -
【数据结构与算法】之深入解析“合并两个有序数组”的求解思路与算法示例
一、题目描述给你两个按“非递减顺序”排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目,请合并 nums2 到 nums1 中,使合并后的数组同样按“非递减顺序”排列。注意:最终合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略,nums2 的长度为 n 。示例 1:输入:nums1 = [1,2原创 2021-12-22 20:56:53 · 1357 阅读 · 0 评论