数据结构&算法|刷题专栏
文章平均质量分 87
持续更新优质数据结构知识题目,全方面搞定数据结构!
Yaoyao2024
商务合作&学习交流:Yao2024yaO
展开
-
【Leetcode每日一刷】二维数组花式遍历:一、顺/逆时针旋转矩阵 :48. 旋转图像、二、矩阵的螺旋遍历 |54. 螺旋矩阵
寻常的思路有以下两种:可能会误认为去模拟一下,一圈一圈的去遍历,然后进行旋转;又或者是想去找出当前坐标和旋转后像素对应坐标位置之间的关系,结果发现都想不出来很好的解决方法。它用了另外一种比较巧妙的方法,对于计算机比较好理解,但对于我们可能一下子想不到的方法去解决了。(对于这种题,只要有个印象,以后遇到类似题目就不会懵圈了。这题的意思很简单,就是让我们把矩阵。不可暴力模拟,先镜像,后水平翻转。❗❗核心思想/ 关键。原创 2024-03-14 16:12:20 · 591 阅读 · 0 评论 -
【Leetcode每日一刷】滑动窗口:209.长度最小的子数组
更新当前窗口中的数据情况,再拿去和题目所需的可行解进行比对,判断当前窗口内的情况是否可行!找到一个可行解&更新得到一个可行解后,对题目最终需要的最优答案进行更新!🪧 滑动窗口本质也是双指针的一种技巧,特别适用于。左右指针滑窗口,一前一后齐头进。注意下面框架中的6个关键点!,等会你会发现它们操作是完全。本题思路(依据算法框架)❗❗核心思想/ 关键。原创 2024-03-10 21:19:57 · 815 阅读 · 0 评论 -
【Leetcode每日一刷】数组|双指针篇:977. 有序数组的平方、76. 最小覆盖子串(附滑动窗口法详解)
当有可能含负数的有序数组平方后,最大值只有可能位于数组两侧,整个数组呈一个凹函数,从两边向中间递减。但是这题的关键如上,也就是平方后数组由两边向中间递减,最大值只有可能位于两侧。由于这样的特性,利用。,每次循环,将左指针和右指针处的元素进行比较。更新当前窗口中的数据情况,再拿去和题目所需的可行解进行比对,判断当前窗口内的情况是否可行!双指针, 从两边向中间探测,互相比较,逐渐挑出最大值,再到次最大值…——两者的情况进行比对,判断当前窗口中的情况是否可行。完全一样时,就可行,换句话说,就是不能直接把。原创 2024-03-09 12:49:34 · 858 阅读 · 0 评论 -
【Leetcode每日一刷】数组|704. 二分查找、27. 移除元素
【易错】二分查找的重点就划分区间、逐渐缩小、两边夹,关于划分区间这题第二个代码我用的划分为[left,mid]和[mid+1,right],为什么不是**[left,mid-1]和[mid,right]**呢?—因为会容易出现死循环使用和public:right : -1;【重点】二分法的关键是缩小区间,死循环发生的原因是某次循环没有缩小区间导致二分失败。【重点】此题right设置为的原因是array.length也有可能是问题答案【重点】将二分查找的判断条件写成。原创 2024-03-06 19:56:23 · 926 阅读 · 0 评论 -
【Leetcode每日一刷】贪心算法| 45.跳跃游戏 II
这题还是比【55.跳跃游戏】难一些的。第一个版本只是说,求跳跃的范围,覆盖到了终点即可。这题则是,能保证覆盖范围到达终点,求的是最少跳几次,跳到终点。这题的话也是偏直觉,最好能一步到就好,一步到不了,两步能到吗?两步还到不了,三步呢?听起来是不是还挺简单的?但是实现起来,还是有一些需要考虑的。明白了大致思路,但是实现起来还是有问题,我们再来捋一下思路。原创 2024-03-05 21:46:52 · 829 阅读 · 0 评论 -
【Leetcode每日一刷】贪心算法|122.买卖股票的最佳时机 II、55. 跳跃游戏
🦄解题思路:;这是正确的直觉:没错,很有道理,但是我想到了一个反例:如下图,如果按照上面的思路,则第一个元素买入,第二个元素卖出;遍历到第二个元素时,由于已经卖出,按理来说不能再操作了,但是由于当前元素低于第三个元素,还应该买下第二个元素,这样似乎违法了每天只能有一个操作的前提。但是后来看了一些题解,发现这种情况根本不影响,虽然正确情况的:第 0 天买入,第 2 天卖出,那么利润为:prices[2] - prices[0]。原创 2024-03-01 21:01:49 · 767 阅读 · 0 评论 -
【Leetcode每日一刷】哈希表|纲领、242.有效的字母异位词、349. 两个数组的交集
下面针对做题要用到的三种结构讲一下(也是重复造轮子了算是)常见的三种哈希结构当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。unordered_set在C++11的时候被引入标准库了,而hash_set并没有,所以建议还是使用比较好,这就好比一个是官方认证的,hash_set,hash_map 是C++11标准之前民间高手自发造的轮子。🦄总结一下,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。原创 2024-02-29 21:56:17 · 1030 阅读 · 0 评论 -
【Leetcode每日一刷】动态规划算法: 62. 不同路径、63. 不同路径 II
前言:动规五部曲以下是《代码随想录》作者总结的动规五部曲确定dp数组(dp table)以及下标的含义确定递推公式(状态转移方程)dp数组如何初始化确定遍历顺序举例推导dp数组所有动态规划问题中,一个状态一定由上一个状态推导而来,这点就有别于贪心,贪心没有状态的推导更别说什么公式,贪心只是从局部选取最优解。例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。原创 2024-02-29 21:09:54 · 839 阅读 · 0 评论 -
【Leetcode每日一刷】贪心算法01:455.分发饼干、376. 摆动序列、53. 最大子序和
代码随想录贪心算法并没有任何套路,它的本质是寻找局部最优解。严格的数学证明为以下两者数学归纳反证前者基本上是劝退了,反证就是看能不能对你想出的这种算法or模拟举出反例。与其叫贪心,我个人现在更愿意将其理解为模拟,偏常识形式的,没有一个统一的套路。可以从下面的题目中看出。原创 2024-02-28 20:19:57 · 1135 阅读 · 1 评论 -
【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈
一、 模拟实现循环队列二、用栈实现队列⭐三、225. 用队列实现栈原创 2023-08-28 20:06:50 · 724 阅读 · 0 评论 -
数据结构】二叉树篇|超清晰图解和详解:后序篇
🍊 前序:它能获得的信息:当前节点,但是不难获得左右节点(或者可以叫做子树的信息),一般大多数情况。🍊后序:当前节点信息+左右子树信息。所以当一个二叉树的题目,在遍历的过程中不仅需要看遍历到的当前节点的信息时,还要看其子树的信息,那么通常要在后序位置上做文章,利用好递归函数的返回值——获取子树信息。—— 本质还是第二种二叉树问题:分解成子问题,利用好返回值原创 2023-08-27 20:30:40 · 893 阅读 · 1 评论 -
【数据结构】二叉树篇|超清晰图解和详解:二叉树的序列化和反序列化
🍊 序列化:本质就是二叉树的遍历,就那么几个:前序、中序、后序、层序。而序列化只不过就是在遍历到节点时,把它记录下来,空节点也是节点,也要记录(一般就是#)。🍊反序列化:字符串构建二叉树,本质是子问题,也就是递归。原创 2023-08-27 19:44:15 · 756 阅读 · 0 评论 -
【数据结构】二叉树篇|超清晰图解和详解:二叉树的最近公共祖先
首先要明白,当root为p,q的最近祖先节点,只有下面3种情况:1. p,q在root分别存在于root的左右子树中(异侧)——>root即为最近祖先节点2. p, q均在root的左侧——>p/q即为最近祖先节点3. p, q均在root的右侧——>同理原创 2023-08-14 17:37:02 · 2957 阅读 · 4 评论 -
【数据结构】二叉树篇|『构造二叉树』刷题
🍊 二叉树的构造问题一般都是使用「分解问题」的思路:构造整棵树 = 根节点 + 构造左子树 + 构造右子树( 关键在于明确递归函数的定义,然后利用这个定义,构建二叉树的套路很简单,先找到根节点,然后找到并递归构造左右子树即可)原创 2023-08-14 15:51:10 · 618 阅读 · 0 评论 -
【数据结构】二叉树篇| 纲领&思路02+刷题
【数据结构】二叉树篇| 纲领&思路01+刷题已经给出,这篇主要还是刷题,进行巩固🍊 不过新增了“二叉树的层序遍历”(第二题),我个人暂时认为它不属于前面所讲纲领两个模式的任何一个,所以我将它单独提出来。原创 2023-08-13 21:33:39 · 683 阅读 · 1 评论 -
【数据结构】二叉树篇| 纲领&思路01+刷题
所谓前序位置,就是刚进入一个节点(元素)的时候,后序位置就是即将离开一个节点(元素)的时候,那么进一步,你把代码写在不同位置,代码执行的时机也不同前序位置的代码只能从函数参数中获取父节点传递来的数据,而后序位置的代码不仅可以获取参数数据,还可以获取到子树通过函数返回值传递回来的数据。🌟二叉树的所有问题,就是让你在前中后序位置注入巧妙的代码逻辑,去达到自己的目的,你只需要单独思考每一个节点应该做什么,其他的不用你管,抛给二叉树遍历框架,递归会在所有节点上做相同的操作。原创 2023-08-13 19:48:23 · 494 阅读 · 1 评论 -
【Java】数据结构篇——Stack:经典栈OJ题 |超详题解代码
1、括号匹配问题⭐2、逆波兰表达式求值⭐3、最小栈⭐4、栈的压入、弹出序列⭐原创 2023-08-10 16:21:22 · 216 阅读 · 0 评论 -
【Java】数据结构篇:经典链表OJ题 |超详细图解+代码
💡Step1:找到链表中间节点利用快慢指针法:slow = slow.next; quick = quick.next.next;💡Step2:逆置后半部分链表💡Step3:判断回文原创 2023-08-01 16:43:15 · 341 阅读 · 1 评论 -
【数据结构】超详细讲解:算术表达式转化为后缀表达式、前缀表达式、表达式树的构建
中缀表达式:中缀表达式是我们常见的数学表达式,其中运算符放置在两个操作数中间,例如:3 + 4 * 2。在中缀表达式中,还可以包含括号,用于改变运算符的优先级。后缀表达式:后缀表达式(也称为逆波兰表达式)是一种将运算符放置在操作数后面的表达式,例如:3 4 2 * 1 5 - 2 ^ / +。在后缀表达式中,所有操作符的优先级相同,而括号则不再需要。前缀表达式:前缀表达式(也称为波兰表达式)是一种将运算符放置在操作数前面的表达式,例如:+ / * 3 4 2 ^ - 1 5 2。原创 2023-04-22 15:53:51 · 6680 阅读 · 6 评论 -
【数据结构】数组的顺序存储(1、2、3、n维数组的元素地址计算)|保姆级详解+图解
数组是一种特殊的的数据结构,在存储结构是顺序存储(一个连着一个),所有只要给定数组的维度,和各维度的长度,数组中元素个数就是确定的。且给出首元素的地址,例如根据A[i][j][k],的i、j、k就可以计算出该元素的地址(或与首元素的地址之差)在计算机中,内存储器的结构是一维的。对于一维数组,可以直接按照顺序直接存储对于常见的二维数组,通常采用两种方式实现物理结构上的一维顺序存储行优先:一行一行的存储,存完一行,再在这一行尾元素后面接着存储下一行列优先、原创 2023-04-05 10:52:34 · 12660 阅读 · 13 评论 -
【数据结构】特殊矩阵的压缩存储|保姆级详解+图解
在线性代数这门学科中已经学习了矩阵。在高级计算机语言中,矩阵常用二维数组表示。所谓**“压缩存储”**,目的在于节省空间!体现在,为多个值相同的元素只分配一个存储空间,多元素值为0的元素不分配空间二维数组A[n][n]和的写法是等价的。如果数组写法为,则说明指定了下标是从1开始存储元素。二维数组元素写为a[i][j],注意数组元素下标i和j通常是从0开始的。矩阵元素通常写为a i,j或者a(i),(j),注意这时的i和j代表的行号和列号,都是从1开始的!这里我们讨论两种特殊矩阵。原创 2023-04-05 09:04:31 · 6256 阅读 · 4 评论 -
【数据结构】夯实基础|线性表刷题01
不要被代码长度劝退了!都是很简单的操作,目的在于熟练掌握和使用数据结构!下面是用C语言描述的数据结构。严格意义上来说数据结构是门单独的课,用什么语言描述不是很重要,主要是学习如何构造相应的数据结构并且实现其相应操作。题目后面的⭐对应相应的难度(三个星其实也不是很难)原创 2023-03-21 20:20:00 · 696 阅读 · 12 评论