自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(58)
  • 收藏
  • 关注

原创 力扣1146 快照数组

对于get方法,若没有构建数组存储每个时刻的数据而是直接记录版本更新情况的话,在二分查找时所检索的不是等于当前snap_id的记录,而是需要找到索引list中小于snap_id的第一个元素(因为同一个index出,可以有多个快照号相同的记录);因此二分查找使用红蓝染色法,返回left。的思路不构建数组,而是保存每个数组位置set的记录,记录采用的是键值对的形式,键为当前快照号,值为传递过来需要修改的val;思路:初始时,使用的思路是对于每个快照的数组都进行一次副本保存,但是提交后是时间超出。

2024-04-26 16:05:39 256

原创 字符串模拟运算相关

思路:类似于三数之和的解题,但是更加简单,不用考虑组合重复。

2024-04-18 18:47:18 227

原创 前缀和练习

【代码】前缀和练习。

2024-04-16 12:14:05 113

原创 代码随想录算法训练营番外 刷题日记0301 || 29、两数相除,31、下一个排列

思路:不断相减就是求解的最直接方法,我这样计算时间复杂度有点高。

2024-03-01 21:11:03 436 1

原创 代码随想录算法训练营总结篇

说回自己的刷题过程,自己在完成求解后,其实很少会再去学习一遍其他的解法了,除非自己的方法是效率低下的,想要找寻更优的方法。回溯算法比较清晰,回溯题给人的感觉一般也是很明朗的,我也非常喜欢回溯题,其他包括线性表的题目,字符串的题目以及列表等的题目,在没有接触动态规划前,其实刷题还是蛮有信心的,除了N皇后、飞机票、数独还有三数之和和四数之和那几道绞尽脑汁的题目,其他真的是每天都刷的很有趣,但是动态规划题目把我打回原形,以前的我也是对于动态规划一直不太理解,但是这次是真正感受到了动态规划求解的一些思路。

2024-02-29 22:37:12 476

原创 代码随想录算法训练营day30 || 332.重新安排行程(未完成),51. N皇后,37. 解数独(未完成)

【代码】代码随想录算法训练营day30 || 332.重新安排行程(未完成),51. N皇后,37. 解数独(未完成)

2024-02-28 22:09:53 345

原创 代码随想录算法训练营day60 || 647.回文子串,516. 最长回文子序列

【代码】代码随想录算法训练营day60 || 647.回文子串,516. 最长回文子序列。

2024-02-28 22:04:18 442

原创 代码随想录算法训练营day64 || 84. 柱状图中最大的矩形

首先补充昨天接雨水题目解法的更新,中给出双指针和单调栈的解法,其中所采用的思想是计算每一列可以容纳的雨水,非常的关键,是指导双指针的重要思想。双指针的核心思路是对于每一列,其所容纳的雨水量必定取决于左右两侧的最高高度,即每一列考虑自身是出于山谷的中间还是两边;这是所有可以容纳雨水的情况;山峰的情况是必定容纳不了雨水的。而双指针的优化是使用了数组存储各个位置所记录的单边最大高度,有一点动态规划的思想。双指针的求解思路非常的厉害;单调栈也是延续这一个思想,栈内以递增的顺序进行元素的存储。

2024-02-28 21:58:57 345

原创 代码随想录算法训练营day61 || 739. 每日温度,496.下一个更大元素 I

【代码】代码随想录算法训练营day61 || 739. 每日温度,496.下一个更大元素 I。

2024-02-27 14:34:19 380

原创 代码随想录算法训练营day63 || 53. 下一个更大元素,42. 接雨水

快指针随着数组遍历而移动,慢指针总是指向height不为零的位置,那么如何在快指针访问的位置适时的赋予慢指针呢?观察求和填雨水的求法,我们需要比较快慢指针所指向位置的高度,选择较小的来计算。单调栈从栈首至栈尾是递增,所以如果出栈的情况,那么一定是可以有雨水可接。但是需要注意栈中存在32101这样的山谷状,此时出栈一次求取的是最山谷部分的雨水量,其他部分可以随着后续出栈操作而更新,但是需要需要减去先前已出栈部分的。举个例子4,2,1,3,0,5,如果不额外计算一步的话,橙色块的雨水就没有能够记录下来。

2024-02-27 14:24:30 349

原创 代码随想录算法训练营day59 || 583. 两个字符串的删除操作,72. 编辑距离

所以不管是dp[i-1][j],dp[i][j-1],dp[i-1][j-1]都是属于对s或者t进行了一次编辑。本题dp[i-1][j],dp[i][j-1]都是删除操作,dp[i-1][j-1]与dp[i][j]而言是替换操作;因为这个替换体现在dp[i][j]会得到dp[i-1][j-1]+1,即我默认通过替换一个元素使得s[i]与t[j]相等了,那么自然转移到的前一状态就是dp[i-1][j-1]。所以在字符题,用动态规划求解的话,发生转移的条件就是判断s[i]与t[j]的相等或不相等。

2024-02-25 16:46:57 420

原创 代码随想录算法训练营day58 || 392. 判断子序列115. 不同的子序列

因此s不选当前的位置,即类似于两者不是合适的匹配元素,要找其他的元素,所以此时是要延续上一状态dp[i-1][j],这里是在s中找有几个t,所以只会由s来判断当前t位置的元素我是否选择,所以仅仅是dp[i-1][j],而不考虑dp[i][j-1];而站在 编辑距离 的角度来看,这个dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1])的操作就是删除i位置元素或删除j位置元素,从而求取两个字符串的共同序列。不等时,按照相等时不选择的状态延续操作,赋值dp[i-1][j]即可。

2024-02-25 16:07:43 420

原创 代码随想录算法训练营day57 || 1143.最长公共子序列,1035.不相交的线,53. 最大子序和

拿示例一A = [1,4,2], B = [1,2,4]为例,其实也就是说A和B的最长公共子序列是[1,4],长度为2。这个公共子序列指的是相对顺序不变(即数字4在字符串A中数字1的后面,那么数字4也应该在字符串B数字1的后面)思路:直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。思路:在递推方程与求公共数组的几乎类似,但是不同的是本题要求的公共序列不需要元素的连续,所以当s[i]!

2024-02-21 10:46:23 369

原创 代码随想录算法训练营day56 || 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

心得:对于序列比较类型的题目,若使用动态规划进行求解,首先状态转换是不容易看出来的,因为序列是元素不断在访问,而不是我们前面的背包或者股票以及打家劫舍那样有充分形象的动态来形成状态,序列比较中只是遍历,遍历一个位置后整体环境没有多大变化,所以序列题目的动态规划需要从暴力求解中寻找思路,甚至可以理解为是对暴力求解的优化。其次就是序列题目需要定义一个额外的用来保存全局最大值的变量,序列题目的dp数组是一直暂存数组不同位置的状态,不一定在末尾保存的就是整个数组遍历之后的最佳值。

2024-02-20 09:56:28 318

原创 代码随想录算法训练营day55 || 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费

相应的dp[i][0],第i天结束后处于不持有股票状态且不处于冷冻期;dp[i][1]表示结束时处于持有股票状态;dp[i][2]表示今天结束之后处于冷冻期状态且不持有股票。我个人理解上还是认为三个状态更加好理解,但是的确三个状态之中存在一个疑惑,这点我们一会儿来说明。思路:本题增加了一种冷冻期的量,引出一种全新的状态。我所理解的是本题增加了一个状态,是冷冻状态。思路:就是在 122.买卖股票的最佳时机II 中每次卖出股票时增加手续费的操作即可求解。现在给出三个状态:0表示不持有股票;

2024-02-19 12:57:01 824

原创 代码随想录算法训练营day54 || 123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

从中我们可以看到不持有状态的dp[i][0]总是依赖dp[i-1][1],同理dp[i][1]也是依赖dp[i-1][0]。(记住这一点,非常的重要!,如果还原,应该是dp[i-1][0][k-1]-prices[i],用来进入一次新的交易。

2024-02-18 10:11:11 853

原创 代码随想录算法训练营day53 || 121.买卖股票的最佳时机,122.买卖股票的最佳时机||

思路:二维dp在递推公式上与 买卖股票的最佳时机I 有这不同,是dp[i-1][0]-prices[i]替代-prices[i]这个过程, 其实本质就是-prices[i]表示的dp[i-1][0]总是零,即模拟出了总是第一次买入,而没有其他买入所带来的收益。而去两题针对dp[i][1]取max都是喜欢买的价格尽可能的小或者减少利润的消耗。思路:寻找全局最大间隔,对于不满足后大前小的地方,直接继承前一位置的状态。

2024-02-17 22:36:27 380

原创 代码随想录算法训练营day53 || 198. 打家劫舍,213.打家劫舍II,337.打家劫舍 III

其实归根到底这么想,是因为打家劫舍系列的题目,i位置的状态迁移总是与i-1和i-2两个位置相关,i继承于i-2,i-1是i所参考对比的,那么在访问过程中,以及最后输出结果的时候,需要判别的就是dp[n] dp[n-1]两个位置;k]+nums[j] 这样统计。递推公式与 打家劫舍I 的公式一致,而遍历顺序上,可从数组的任一位置开始,因此我们可以选择从数组的0位置开始,并且注意特殊的nums.length-1位置是从0位置开始遍历时不可以再接触的一个位置。思路:树形结构的动态规划题目,本题不会,做不出来。

2024-02-16 16:07:22 389

原创 代码随想录算法训练营day51 || 139. 单词拆分,多重背包问题

背包问题总结。

2024-02-15 11:30:02 1269

原创 代码随想录算法训练营day44 || 52. 完全背包问题,518. 零钱兑换II,377. 组合总和 Ⅳ

思路:(题目类型:放满完全背包问题),但是却是第一次遇到的存在不可放的情况的题目。而针对不可行数值,无需进行额外的操作,仍然保留dp[j]+=dp[j-nums[i]]的递推公式,不可找零的数值将存在传递性,可自行将当前位置的不可行传递到下一个位置。思路:与所预料的一样,就是01背包问题的重量遍历顺序从头开始遍历即可求解,另外优化的地方在于重量可以从当前物品对应的重量开始进行遍历,因此按物品外重量内的遍历顺序来遍历的话,只有j>=weights[i]才会进行递推,所以不妨直接在for循环赋值上就体现出来。

2024-02-14 09:34:12 422

原创 代码随想录算法训练营day50 || 57. 爬楼梯,322. 零钱兑换,279.完全平方数

思路:延续零钱兑换II 的做法,统计某个数值可以被找零,是求的组合,所以本题的递推公式也是包含累加的思想,但是由于统计的是硬币数量,因此在每判断一种硬币后,是将j-coins[i[的位置的值加1得到dp[j]位置的值。区别dp[j] += dp[j-coins[i]]和dp[j] = dp[j-coins[i]]+1;递推公式与找零的递推公式保持一致,使用的是减去一个当前可用物品后加一。思路:递推公式dp[j]+=dp[j-nums[i]]的练习 ,这里爬楼梯的来源从2变成了m,所以求和m个位置即可。

2024-02-14 09:17:27 337

原创 代码随想录算法训练营day43 || 1049. 最后一块石头的重量,494. 目标和,474. 一和零

思路:本题和划分子集的思想也是一致,但是需要额外主要的就是我们是以石头重量总和一半为目标,全力去凑,希望可以访问半数石头总和这样大小的背包,因而在最后的结果上,我们是将将dp的最后一个元素,需要用石头重量总和减去dp数组的最后元素作为结果。// 时间复杂度O(n^2)// 空间复杂度O(n)// 本题形成了划分两堆石头的思路,那么本题就和划分子集一样sum+=i;i++){j>0;j--){

2024-02-10 13:20:48 340

原创 代码随想录算法训练营 day42 || 01背包问题,416. 分割等和子集

思路:在拿到这道题目时,其实第一想法是回溯,去不断试错当前的子集和;但回溯的时间复杂度必定是指数级,大概率会超时。其次想到贪心,走动态规划,因为这是一个不断加入元素尝试的过程,所以是动规。那么再看分割子集,其实也是一个不断加入元素从一个集合至另一个集合的过程,所以可以视作背包问题,并且每个元素可以取一次,所以是01背包问题,下面需要处理的就是动态规划,我们的目标是操作数组和,所以和就是本题所理解的重量,以物品数和数组和作为两个维度构建数据即可求解。

2024-02-09 11:17:04 438

原创 代码随想录算法训练营day41 || 343. 整数拆分,96. 不同的二叉搜索树

视频讲解:(这两题真的非常的巧妙,自己也是真的没想到!!!

2024-02-04 22:56:44 352

原创 代码随想录算法训练营day39 || 62. 不同路径,63. 不同的路径||

完成这道题之后,动态规划接触的第一个类型可以归纳为总数题,即计算到达某地的总的方法数,对于该类题目其状态转移没有额外需要相加的内容,也不是对于多个维度,多出来源去max或取min,而仅仅是将所有的来源都相加在一起作为当前位置的dp数组值即可;思路:与不同的路径一样的思路,只不过增加了些条件,需要进行判断,这影响了初始化,以及dp遍历时的赋值,本题关键的地方在于初始化,一行或一列上如果存在障碍物,那么之后的位置就都不可以达到了,在初始化的时候一定要当作当前m或者n就是等于1来进行模拟与赋值。

2024-02-03 16:23:54 328

原创 代码随想录算法训练营day38 || 509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

另外关于动态规划与贪心的区别,“动态规划中每一个状态一定是由上一个状态推导出来的;贪心没有状态推导,而是从局部直接选最优的” ,可见贪心可以是动态规划,但是动态规划不一定是贪心,暂时的理解,贪心策略的重心在于针对某个维度寻求其最优,从而间接解题;但是动态规划师多个维度同时考虑,通常是两个维度一同考虑,可能可以涉及三个维度,分别用dp数组下标以及数组元素含义来表示二到三个维度。贪心中出现的重叠区间、两个维度的题目,我们都是单独的操作各个维度。思路:采用注释对本题的求解进行了描述。

2024-02-02 17:13:54 434

原创 代码随想录算法训练营day37 || 738. 单调递增的数字,968.监控二叉树

如果不满足,那么他就要通过降位来寻找最大且合适的数,这里的降位的意思就是十位以上的位数大小进行缩减。通过观察,个位数字总是可以取到9,但是十位就需要在原来n十位的k基础上,在k-1与9之间选择一个合适的,这里的k-1就是降位,他将一个十位借给了个位,从而可以让个位取到9,并且也满足了个位一定大于等于十位;另外确定遍历的方式非常的重要,我初始采用层次遍历的方式确实可以满足测试用例,但是在验证所有测试用例的时候,发现简单的层次遍历规律根本无法满足所有的情况,还是应该自底向上采用深度遍历的方式实现。

2024-02-01 23:25:04 510

原创 代码随想录算法训练营day36 || 453. 无重叠区间,763.划分字母区间,435. 合并区间

回看这里所有的情况,其中最为关键的就是 a∩b,c∩b,c不∩a 这种,如果按照之前保存距离的方式,会导致a被删,c也被删,删的次数不满足贪心找最少的删除次数,这也就是导致我无法得到最优解的原因,所以集合的更新条件是,对于存在交集的集合,保留上限更小的集合,删除上限大的;思路:在射箭以及无重叠区间所形成的先排序再操作重叠区间的思路之下,本题于我个人而言是今天三题中最简单的一题,区间重合时的更新策略也非常的清晰,就是形成并集,对于不重合的区间,就将指针移动到区间位于数轴更为右侧的那个区间即可。

2024-01-31 13:15:18 1345

原创 代码随想录算法训练营day35 || 860.柠檬水找零,406. 根据身高重建队列,452. 用最少数量的箭引爆气球

思路:没有特别明确的贪心思想,可能涉及到贪心的思想就是在处理找零15元时,优先消耗10元的纸币,没有10元的,但消耗3张5元的。本题的关键就是统计5元,10元纸币的数量,虽然是有必要统计一下总共的利润来评估是否还有钱来找零,但是所有的找零都是花费的5元和10元,所以20元的无需统计,那么总利润统计也就没有意义,只要剩余的5元和10元纸币的数量可以应付所有找零,那么本题就可以返回true;首先自己实现了这道题的题解,认为重叠区间类型题目的解题就是合并存在交集的区间,然后统计最终还剩下几个相互独立的区间;

2024-01-30 22:03:50 415

原创 代码随想录算法训练营day 32 || 122.买卖股票的最佳时机 II,55. 跳跃游戏,45.跳跃游戏 II

上的思想其实是一致的,Carl哥是更新最大范围,而是在当前位置开始寻找最远可到达的位置,然后findmax返回就是到达最远位置是哪个点,这个点就是我的下一跳位置;如果最远范围已经到达末尾了,那么可以直接返回,但是需要注意的就是最远的范围是没有到达的,只是我在当前i位置的num[i]范围中某个位置j可以跳到的最远位置j+nums[j],跳到j这个位置我们记录了,但是最大范围是需要j再跳一步的,所以需要额外的再count+1,然后return。(方法还是比较绕的,希望我的讲解可以使您明白)

2024-01-29 22:32:25 406

原创 代码随想录算法训练营day34 || 1005.K次取反后最大化的数组和,134. 加油站,135. 分发糖果

因此我们假设当前是i位置的判断,i会对i-1和i+1位置的糖果数产生影响,i+1会对i+2和i位置产生影响,但是i+1在判断时的影响会传播至i-1处,但是我们此时修改不到,这就是本题的最大陷阱,举个例子8,10,7,2,1,我们从左向右遍历,统计了7的时,会从2内获取优胜感;另一种理由就是我需要在每个位置比较相邻的位置,那么其实就是需要参照两个方向的元素,所以我们使用一次循环专心处理一个方向,另一个方向可以在上一个方向的基础上满足剩下方向中存在的大小关系,并且还可以对上一个方向存在的大小关系进行补充。

2024-01-29 22:10:03 890

原创 代码随想录算法训练营day31 || 455.分发饼干,376. 摆动序列,53.最大子序列的和

思路:题目中明确饼干不可以分割,而要想贪心的策略,在于每一次都可以将最小分量的饼干分给最接近其胃口的孩子。

2024-01-28 22:24:42 333

原创 代码随想录算法训练营day29 || 491.非递减子序列,46.全排列,47. 全排列||

思路:要求结果不重复,数组内存在重复元素,但是不强调元素顺序不可变,所以使用visited数组结合数组排序解题。思路:组合问题,存在重复元素,强调nums内元素顺序。采用startindex以及set局部已用元素去重;

2024-01-24 11:35:18 889

原创 代码随想录算法训练营day28 || 93.复原IP地址,78.子集,90.子集II

,依据这个条件可以明确也是如何分割字符串一般是对不同长度的字串进行衡量,递归循环遍历时所构建是不同长度的字串,然后判断是否满足[0,255]条件。思路:与存在重复的元素的组合|| 解法一致。思路:与求数组的组合思路基本一致。正好由四个整数(每个整数位于。之间组成,且不能含有前导。

2024-01-23 20:42:22 377

原创 代码随想录算法训练营day27 || 39. 组合总和,40.组合总和II,131.分割回文串

带着这个思想我们进行递归函数的编写,这个思想直接指明的是回溯的循环部分怎么写,遍历的内容应该是子串的长度,如此我们就可以对每个子串进行控制,并且可以精确的确定每个划分的位置;既然循环遍历的是每个子串的长度,那么遍历结束的标志,即遍历完整个字符串就是截止条件,否则递归无法终结,也相应的推导出了所需要的截止条件,完成递归回溯的整体函数。思路:不同于以往的组合类型的题目,该题所给出的数据中出现了重复元素,因此在存在着重复元素的集合中输出所有的满足要求的组合,需要对组合进行去重。思路:题目中给出这样一句话:“

2024-01-23 20:10:51 381

原创 代码随想录算法训练营day25 || 216.组合总和III,17.电话号码的字母组合

递归每一层遍历的是当前数字所对应的字符集内的所有字符,这与 组合问题以及组合问题||| 都是不同的,这两个问题的元素集合在每一次递归中都是共用的,每次都将从元素集合内选择部分元素,因此存在元素无法满足进行递归研究的可能,所以存在剪枝的可能。思路:本题是 77.组合 的进阶,也是不重复地选择元素集合的K个元素形成结果,并且也需要主要的到的是元素选择所形成的集合是组合而非排列,因此当元素集合内元素有序时,选择的方向必须只有一个方向;其次本题额外多的条件是K个数和为n,添加至回溯模版内递归条件的终止条件部分。

2024-01-20 22:09:25 384

原创 代码随想录算法训练营day24 || 回溯法原理讲解,77.组合

思路:使用回溯法进行多层遍历实现解题,可使用剪枝加快不可满结果继续计算时,就提前结束当前的分支的递归过程。

2024-01-19 19:08:44 404

原创 代码随想录算法训练营day 23 || 669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树

思路:结合BST的定义以及特点,以小于low为例,小于low的某个节点无非位于左子树或者右子树,位于左子树,左边全部是删除的目标;位于右子树,右子树左侧的所有节点全部删掉,所以只有删除位置的右子树有用;其次,删除的方向要自底向上,避免不满足low和high范围的节点存在于深度高的部位,在仅仅删除上面不满足要求节点后直接把下面不符合要求节点直接赋值回去了。思路:题目中明确数组是有序,是绝佳的条件。那么就和确定数组中间节点是root一样,不停二分,每次二分的位置都是子树的根节点。

2024-01-18 21:57:24 370

原创 代码随想录算法训练营 day22 || 235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点

其中关于定位节点位于的方向非常的有必要,然后对于定位到的节点,直接在其位置上就进行操作,因为常理上应当是定位到待删除结点的父节点,然后对父节点的left或者right进行操作,然后返回被删除的节点,但是现在直接在递归上通过返回删除位置,将删除了节点的形成的子树或者路径直接缀连到了原来的树上,真的厉害。思路:昨天的二叉树的最近公共祖先是使用路径重合位置的方法来实现的,并没有采用递归的方式进行实现,其实路径方法也可以用在BST的最近公共祖先上,但是时间效率较低,所以尝试理解学习递归的思想。

2024-01-17 23:04:04 380

原创 代码随想录算法训练营 day21 || 530.二叉搜索树的最小绝对值之差,501.二叉树中的众数,236.二叉树的最近公共祖先

是因为二叉搜索树,是这个条件赋予了之后,我们仅仅需要定位根节点与左子树最右节点和根节点与右子树最左节点,这两种情况之中一定是最小差值的存在之处,然后对每一个具有子树的节点都这么考虑一遍,可以统计处全局最小差值,而我们还原来看,左子树的最右节点与右子树的最左节点之间在遍历后的结果上就是相邻的(中序遍历的结果),下面给出图示让大家理解。所以除了叶子节点,每一个有子树的节点都是有两个与自己最为相接近的节点,而我们计算节点差的最小值,这表明树上一定不只是存在叶子节点,一定是有根节点或者父节点;

2024-01-16 18:01:01 785 1

空空如也

空空如也

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

TA关注的人

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