自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 第四十三天 | 416.分割等和子集 1049.最后一块石头的重量|| 494.目标和

那么如果背包容量为target, dp[target]就是装满 背包之后的重量,所以 当 dp[target] == target 的时候,背包就装满了。2.递推公式:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);1.dp[j]含义:背包容量为j时,最大价值为dp[j]。2.递推公式:dp[j] = max(dp[j], dp[j - nums[j]] + nums[j])1.dp[j]含义:背包容量为j时,放进物品后,背的最大重量为dp[j]

2024-05-24 23:53:08 77

原创 第四十二天 | 背包问题理论

2.递推公式:此时dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i,一个是取dp[j - weight[i]] + value[i],即放物品i,指定是取最大的,毕竟是求最大价值。2.递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。

2024-05-23 23:28:53 250

原创 第四十一天 | 62.不同路径 63.不同路径|| 343.整数拆分 96.不同的二叉搜索树

确定遍历顺序,先来看看递归公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));2.状态转移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1](遇到空位置才进行计算)dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。2.动态转移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]拆分0和拆分1的最大乘积是多少?

2024-05-21 21:07:34 230

原创 第四十天 | 509.斐波那契数 70.爬楼梯 746.用最小花费爬楼梯

所以dp[5] = dp[4] + dp[3].2.动态转移方程:dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] = cost[i - 2])2.确定递推公式:dp[i] = dp[i - 1] + dp[i - 2]2.递推关系:dp[i] = dp[i -1] + dp[i - 2]1.dp数组含义:dp[i]代表到达第i阶台阶有dp[i]种方法。3.dp数组初始化:dp[1] = 1, dp[2] = 2。4.遍历顺序:从前向后。

2024-05-21 19:53:35 193

原创 终于进入DP--预言

动规的常见类型:基础、背包、打家劫舍、股票问题、子序列问题。打印dp数组(debug)dp数组以及下标含义。遍历顺序(01背包)

2024-05-21 18:08:04 154

原创 第三十九天 | 738.单调自增的数字 968.监控二叉树

我们之后是会用flag将标记点之后的位置全部赋值为9,9难道不比你仅仅做一个自增加的更多么?例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。

2024-05-21 17:55:17 149

原创 第三十八天 | 435.无重叠区间 763.划分字母区间 56.合并区间

其实本题可以重新定义一个result数组,只要将新的区间往里装就行了。如果区间和上一个区间不重合,那直接装进去就行了。注意看差别:差别就是 intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。其实应该是当出现了重叠的情况才需要更新右端点,若不重合那么什么也不需要做。自己在代码实现时想直接在原来的数组里修改,但代码能力不足,写出一下错误代码。代码如下:(注意代码细节)

2024-05-20 19:59:55 211

原创 第三十七天 | 860.柠檬水找零 406.根据身高重建队列 452.用最少数量的箭引爆气球

其实你定义三个变量就好了呀,分别代表手上剩余的5,10,20面额纸币的张数,然后用for循环依次遍历bills,对三个变量进行运算,就可以模拟一次交易。当手上某一种纸币的数量不够找了,就false了。排序得到的结果:对于任意一个数据,它左边都是大于他的,右边都是小于他的。所以每一个元素前插,不会影响其他元素的 j 值,那就大胆前插,他的 j 是几就给他插到满意的位置。先将所有数据的身高(h)从大到小排序,使身高这个维度达到有序,然后再考虑前面有几个人的身高大于或者等于他。自己琢磨的七七八八了。

2024-05-18 16:46:58 307

原创 第三十六天 | 1005.K次取反后最大化数组和 134.加油站 135.分发糖果

解释: 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。

2024-05-18 09:26:53 578

原创 第三十五天 | 122.买卖股票的最佳时机|| 55.跳跃游戏 45.跳跃游戏||

那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1]).....(prices[1] - prices[0])。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。一旦想到这里了,很自然就会想到贪心了,即:只收集每天的正利润,最后就是最大利润了。

2024-05-17 21:10:34 291

原创 第三十四天 贪心算法 | 455.分发饼干 367.摆动序列 53.最大子序和

相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。

2024-05-17 20:49:57 604

原创 第三十三天 | 51.N皇后 37.解数独

n皇后明确说了每一行只能有一个皇后,所以你一行放成功了,就直接下一行,就直接进入下层的递归,而解数独,由于要每一行都要填,所以两次for去遍历,如果一个放成功了,就放右边的一个,也就是进入下层递归,直至最后一次递归发现填完了,也就是该返回最后的那一个true了,如果遇到了false,则不进入下次递归了,证明这次递归填的数有问题,还原后,继续填char的下一个,套娃到结果。本题比多皇后多了一个维度。设置一个行数:row,if(row == 9),说明剩最后一行选择成功了,深度达到了9行,整个表就填完了。

2024-05-16 16:09:58 571

原创 第三十二天 | 46.全排列 47.全排列||

唯一区别,也是核心区别就是用used数组代替startIndex来避免去到重复元素,根本原因就是排列和组合定义的本质不同。使用两个used数组,used1和used2,used1用来树枝去重,used2用来树层去重。排列问题应该可以进行排序的,不影响结果,所以used2也可以用unordered_set代替。用used标记某一元素是否使用过。排列和组合的区别:在数学上的区别都懂,主要是看在代码实现上有什么区别。果然与猜测相同,与46.全排列的区别就是本题的原数组中存在重复元素。题目:47.全排列||

2024-05-16 12:38:35 159

原创 第三十一天 | 491.非递减子序列

当nums[i] == nums[i - 1]时,两个元素数值相同,说明他们在本层起到的作用,是等效的,意思就是说,你在本层取nums[i]也好,取nums[i - 1]也好,当你再往下递归,这层取的数反正都是一样大,所以只用取一遍就好。应该是nums[i - 1],因为经过浅浅的思考一下就可以想到,本层取num[i]得到的结果子集,是被包含于本层取nums[i - 1]得到的结果子集的。在for循环中做判断,如果后一个数大于前一个数,那么就将其存进path,否则直接continue,也不同进入递归。

2024-05-15 15:27:25 291 1

原创 第三十天 | 93.复制IP地址 78.子集 90.子集||

if(isValid(s, startIndex, i)){ //判断[startIndex, i]区间是否合法。因为result.push_back(path)放在了终止条件之前,所以在第一层递归的最开始,path就被记录了一次,此时path为空,问题解决!//不合法,再向后切割也不可能合法,那就不用再向下递归了。if(s[i] > '9' || s[i] < '0'){ //遇到非数字字符。if(pointSum == 3){ //加了三个逗点,说明现在只剩下了四段。

2024-05-14 20:52:44 783

原创 第二十九天 | 39.组合总和 40.组合总和|| 131.分割回文串

修改完的代码,可以保证每一层的递归for循环里,第一个遍历到的元素candidates[startIndex]肯定会被用一次,避免了因为candidates[startIndex] = candidates[startIndex - 1]而被忽略的情况,也就是说candidates[startIndex]至少会被用一次。77.组合要求不同的path不能是同样的元素组成,每一个path里也不能出现相同的元素。但这样是不对的,因为这样的话在下一层里会直接跳过1了,漏掉了[1,1,6]这种情况。

2024-05-14 11:43:04 901

原创 第二十八天 | 216.组合总数||| 17.电话号码的字母组合

即在递归的过程中for循环遍历的集合是不一样的,最高层遍历的集合为digits,而往下一层for循环遍历的集合时每一个digits中的元素对应的字母,例如:1->abc。4.终止条件:index == digits.size().index索引到digits最后一个元素的下一个元素。那么终止条件就是如果index 等于 输入的数字个数(digits.size)了(本来index就是用来遍历digits的)。4.需要加强对index这个参数的理解:index标记遍历到了digits的哪一个元素。

2024-05-13 17:17:27 241

原创 第二十七天 | 77.组合

举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度就构成了树。回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。回溯算法中函数返回值一般为void。

2024-05-13 15:44:56 247

原创 第二十五天 | 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 450.把二叉搜索树转换为累加树

数组长度不知道是奇数还是偶数,奇数左右区间是对称的,偶数左右区间不是对称的,如果不是对称的,是不是意味着左右递归的逻辑就不同呢?注意:1.调用函数时利用引用,并传入左端点和右端点作为参数,可以避免重复建立新的数组,避免浪费空间。然后再一次遍历每一个节点,此时更改节点的数值,需要用到双指针,记录前一个节点原来的数值。对于这个问题,其实完全是自己想多了,因为递归这个逻辑是一直向下进行了,不会受到左区间和右区间是否对称的影响。标准思路:只需要倒叙遍历(右中左),将前一个结点的值加到后一个节点,就可以依次求和。

2024-05-12 18:17:12 285

原创 第二十四天 | 501.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

⑤左右都不为空:要找到最接近待删除节点那个数的数(比key大一点点或小一点点任选其一),定义一个cur作为指针去遍历到最接近待删除节点那个数的数,然后改动树的结构(详见代码)。此时可以用最底层的返回值来模拟一下:新建立的节点被返回了,应该接在上一层的root->left或者root->right,即返回给root->left或者root->right。按照二叉树的特性进行向下搜索递归,一直到最低点,此时建立新节点,并将建立的节点返回,这是终止条件。2.需要删除的节点是叶子节点,左为空右也为空。

2024-05-11 21:08:37 304

原创 第二十三天 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.二叉树的最近公共祖先 235.二叉搜索树的最近公共祖先

有一点易错点,题目并没有说p和q谁的val更大,因此在if的判断中需要分别比较root->val和left->val和right->val的大小,不能主观认为q->val一定大于p->val。大体思路是有点:min记录当前最小值,双指针,pre记录前一个节点,做中序遍历,中的处理为比较min和root->val - pre->val的大小。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。

2024-05-09 19:51:12 333

原创 第二十二天 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树 98.验证二叉搜索树

容易有的误区:根节点是比左子树的所有的value都大,比右子树所有的value都小,而不是仅仅比左孩子的value大,比右孩子的value小。优化版本:直接在树里面,通过中序遍历(左中右)判断是否是搜索二叉树,如果是一颗搜索二叉树,通过中序遍历到的节点一定是不断递增的。但是因为二叉搜索树的特性,遍历顺序与一般的树不同,用中序遍历会大大加快搜索效率。优化:(自己写一个函数)每一层递归不重新构造数组,通过传入下标参数的改变值来控制,大大节省空间效率。终止条件:数组的长度为1,直接返回构造的节点。

2024-05-08 14:44:46 280

原创 第二十一天 | 513.找树左下角的值 112.路经总和 113.路径总和|| 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

3.与终止条件对应:终止条件判断的是当前节点是否为叶子节点,那么在上一层递归时一定要判断node->left和node->right,才不会出现空指针异常的错误。前序遍历:若node->left不为空,则累加并将node->val存入路径,进入递归。用刚刚找的中间节点的值去切割中序遍历到的数列,就可得到左子树和右子树。返回值:要返回根据中序和后序数组构造完的二叉树的根节点,故类型为TreeNode *。终止条件:如果后序数组为0,即size等于0,则return NULL。1.后序数组为0,空节点。

2024-05-07 20:06:25 341 2

原创 第二十天 |110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

尝试作答:遍历到叶子节点时,判断不了其是左叶子还是右叶子,所以要在遍历到叶子节点上一个节点时就进行判断,这是本题和其他二叉树不同的地方。其次,应该用后序遍历。父节点的左叶子之和就是左子树的左叶子之和加上右子树的左叶子之和。遇到的问题:在尝试解答时不知道传入参数应该怎么设置,才能讲加和不断返回给上一层。错误的点在于,自己写的终止条件,应该作为单层递归的处理才对。比较左右子树和统计左右子树高度的道理一样,都应该用后序遍历。题目:257.二叉树的所有路径。题目:110.平衡二叉树。题目:404.左叶子之和。

2024-05-06 15:04:59 237

原创 第十九天 | 104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

首先理解高度和深度的区别:求高度用后序遍历(因为是从下往上去计数),求深度用前序遍历(从上往下去计数)。有一个疑惑:什么时候需要重新写递归函数,什么时候可以直接在函数里进行递归?和最大深度有本质的区别:可能会陷入一个陷阱——仅仅将max改成min,但这样找到的最大深度并不是题目所要求。或者用迭代法,借助队列或栈都可以,进行计数即可,比较简单,代码略。比较左右子树和统计左右子树高度的道理一样,都应该用后序遍历。本题也可以用层序遍历,比较简单,之前已经写过。同样,层序遍历也很简单,之前写过。

2024-05-05 14:18:44 215

原创 第十八天 | 226.翻转二叉树 101.对称二叉树

考虑遍历顺序:本题只能使用后序,因为需要不断收集左右孩子的信息返回给上一层,而前序遍历(中左右)和中序遍历(左中右)都不能做到这一点。这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次。因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果。)采用指针作为参数,通过指针修改实际变量的值,即改变指针。(用队列):和用栈大同小异,略。题目:226.翻转二叉树。

2024-05-04 16:02:07 272

原创 层序遍历

这道题目就是传统的层序遍历,只是一个节点的孩子数不一定,孩子数量为node->children.size(),孩子的节点为node->children[k]。同样借用队列,for循环遍历,但只有当i == size - 1时,将此时node->val存进result.同样借用队列,for循环遍历,每层for循环用sum记录最大值,for循环完毕后将最大值存入result。同样借用队列,for循环遍历,每层用sum求和,for循环完毕后求均值存入result。题目:107.二叉树的层序遍历||

2024-05-02 09:39:40 8

原创 第十四天 |树的递归遍历、迭代遍历、统一遍历

前序遍历:前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。因为这样出栈的时候才是中左右的顺序。分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了。确定每一层递归需要处理的信息。

2024-04-29 00:07:45 410

原创 第十三天 | 239.滑动窗口最大值 347.前k个高频元素

经常说的大顶堆(堆头是最大元素),小顶堆(堆头是最小元素),如果懒得自己实现的话,就直接用priority_queue(优先级队列)就可以了,底层实现都是一样的,从小到大排就是小顶堆,从大到小排就是大顶堆。例如:对于窗口里的元素{2, 3, 5, 1 ,4},单调队列里只维护{5, 4} 就够了,保持单调队列里单调递减,此时队列出口元素就是窗口里最大元素。(因为保持了队列始终单调,只有删除的val与出口的元素相同才会有实际的操作,其他比目前窗口最大元素小,且位置在最大元素前面的元素已经被提前卷走弹出了)

2024-04-28 21:07:59 362

原创 第十一天 | 20.有效的括号 1407.删除字符串中所有的相邻重复项 150.逆波兰表达式求值

dubug了很久才改对,因为始终没有把if和else if的差别当回事,如果用if,在逻辑上当s[i] == ( [ { 时都会进行 else if(st.empty() || st.top()!所以一定返回的是false.题目: 1407.删除字符串中所有的相邻重复项。今天的题思路都是清晰的,主要看细节。尝试解答代码如下:出现访问越界问题。for做倒叙循环,故应该是i--;题目:150.逆波兰表达式求值。题目:20.有效的括号。

2024-04-27 22:14:41 212

原创 第十天 | 232.用栈实现队列 225.用队列实现栈

尝试解答:之前做过,在逻辑上没有太大的问题,此次刷题要更注重代码语言。自己还写不出代码,需要看题解。尝试解答写下如下代码,在pop和top有问题。这道题不想上面的题,之前做完印象已经不深了。两个栈来模拟,一个进栈,一个出栈。题目:232.用栈实现队列。题目:225.用队列实现栈。

2024-04-27 20:14:27 224

原创 第九天 | KMP暂时放掉,完成昨天没做完的 右旋转字符串

首先计算除去循环后,净移动多少位,将整个字符串分开为前半部分和后半部分。先将前半部分反转,再将后半部分反转,再将整体反转,得到结果。总结:先整体反转,得到想要的整体前后顺序(稳定大局),在前后两端局部内反转,得到最终的正常正确顺序。卡码网:55.右旋转字符串。

2024-04-25 22:58:04 246

原创 第八天(续)| 151.反转字符串里的单词(重要)

写完发现逻辑除了问题不满足题意:没有对字符串里的每一个单词进行切片处理,反转之后不是题目的那个意思。此时发现自己遇到了一个问题:这样操作会删除所有的空格,怎么样才能做到在每个单词之间保留一个空格呢?1.删除多余空格:快慢指针,如果快指针所指不为‘ ’,则将对应的存到满指针所在的位置。以上为本次刷题写的c++代码,一直过不了,先放一下,下面附上之前写对的c语言代码。代码里有很多细节,值得反复去做,双指针的运用也比较灵活,巧妙。题目:151.反转字符串里的单词(亟待解决)2.将整个字符串反转。

2024-04-25 22:38:13 156

原创 第八天 | 343.反转字符串 541.反转字符串|| 卡码网 54.替换数字

后来细想,其实从后向前是不会出现这种情况的,发现左右两个指针都是从右往左移动,右边的指针永远在左边指针的右边,最多和左指针重合,重合时说明此时指针的右边全是字母了。在写for循环时,只会习惯性的写i++,这时候就会出现尝试解答是的问题,就是关于如何计数,如何判断什么时候该反转的这个问题。其实这道题是每2k段处理一次,所以直接让i以步长为2k的长度去遍历,同时每次操作操作前k个,这样操作很巧妙,必须积累。其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

2024-04-24 15:42:51 382

原创 第七天 | 454.四数相加 383.赎金信 15.三数之和 18.四数之和

在两次剪枝时,收三树之和的影响,容易犯惯性的错,认为两个数相加就会更大,但没有考虑负数的情况。a遍历每一个数,b,c分别从a+1,nums.size() - 1往中间夹,记录满足条件的三元组,每有一个满足条件的三元组出现,就要进行对应的去重处理。1.用map:因为既需要key来存加和,又需要value来统计该加和出现了多少次。遇到这种题为什么会想到用哈希表:先预处理前两个数组,再在后两个数组里去查。这是从时间复杂度的考虑,两两分为n的平方,一三分为n的三次方。较三数之和而言,差异在于剪枝和去重。

2024-04-23 20:14:09 434

原创 第六天 | 242.有效的字母异位词 349.两个数组的交集 202.快乐数 1.两数之和

遍历,用target减去本次遍历到数,在set里查询是否被存入过,如果有则说明找到了这两个数,需要返回数组下标。使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。1.什么时候用哈希表:当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。1.编写函数,作为循环体的一部分,判断本次循环的数是不是快乐数。

2024-04-22 19:22:41 481

原创 第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 02.07链表相交 142.环形链表||

题目:24. 两两交换链表中的节点尝试解答:定义两个用来遍历的指针,每次跳跃步长为2第一次的错误代码过程中的问题:1.循环体内改变节点指向时思维混乱,没有一个清晰确定的方法2.没有深刻记住一个原则,想要改变哪两个节点指针的指向,一定需要有一个指针指向他们的前一个节点。这样才能知道遍历链表时什么时候结束。

2024-04-20 08:15:33 718

原创 第三天 |203.删除链表元素 707.设计链表 206.翻转链表

cur用来遍历,作为判断条件,如果cur不为null时,还需继续将cur的指向反转。尝试:起始这到题还是有点难度的,因为还没有上数据结构的课程,对于一些本质的东西还理解的不够深刻。node是反转链表后的新头节点,应该被返回(新头结点是node而不是cur)tmp用来记录cur->next,方便cur后移。易错:while循环中要写else才能保证逻辑和语法正确。暂时先跳过,因为底层逻辑还不够清晰,没学。注意:创建dummyhead的方法。简单,只有一点注意和一点易错。203.删除链表元素。

2024-04-18 23:26:37 557

原创 第二天 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

这样这个题在思路上就没有什么难度了。易错提醒:起始位置是一个持续的向后移动的过程,故应该用while循环移动起始位置,而是不if(如果是if则只移动一次,可能还不是最短的情况)改正后:(这种错误的原因是在栈和队列时习惯性的定义方式,在栈和队列的库函数内部会进行内存的分配,所以不会空指针异常,但在这道题这种情况需要提前分配够内存)窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

2024-04-18 22:51:40 693

原创 第一天 | 704.二分查找、27.移除元素

如果你继续用原数组的长度的话,你就会继续遍历到我们已经“舍弃的部分”(那些元素早就随着你的目标元素的删减往前移动了,剩下的都是不要的部分)。2.判断if成立后,nums[i]将会被删去,现在的nums[i]是一个新的数,需要判断是否删除,故应作一次 i--。3.根据区间的选择,确定while循环里是 < 还是

2024-04-17 16:37:47 411

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除