自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 菜鸡勇闯第136场双周赛

菜鸡鼓足了勇气报名了力扣双周赛(后来复盘才知道双周赛更难一点,我真是头铁。每一天都在想,我要是也接触acm,现在一定不会因为算法头大了吧(▼へ▼メ)没想到还拿了个竞赛名次哈哈哈哈哈还在前50%,小力它真的,我哭死。为什么我本科被高数老师忽悠,去打了两年数模o(≧口≦)o。

2024-08-11 22:41:41 243

原创 双指针hard题

依赖merge sort和priorityqueue的废物。正式变身山景城一姐小迷妹✪ω✪。

2024-08-02 00:41:59 232

原创 回溯的undo choice

确保回溯操作能正确撤销当前的选择,以便探索其他可能的解决方案,是放置 path.remove() 的关键。重写N皇后和分割回文串,发现会想不明白path.remove(path.size() - 1)是在if里面还是if外面,问了GPT感觉很清楚。N皇后问题:每次尝试都需要回溯,无论是否成功,因此 path.remove() 在 for 循环内、if 语句外。分割回文子串问题:只有在成功分割出回文子串后才需要回溯,因此 path.remove() 在 if 语句内。

2024-07-27 17:26:21 269

原创 手撕堆&堆排序

【代码】手撕堆&堆排序。

2024-07-26 11:36:36 266

原创 排序之 快速排序、归并排序、堆排序

【代码】排序之 快速排序、归并排序、堆排序。

2024-07-16 22:01:17 108

原创 菜鸡的原地踏步史08(◐‿◑)

芜湖~ 力扣200题打卡!

2024-07-13 16:51:41 174

原创 菜鸡的原地踏步史07(◐‿◑)

【代码】菜鸡的原地踏步史07(◐‿◑)

2024-07-12 14:00:56 326

原创 菜鸡的原地踏步史06(◐‿◑)

【代码】菜鸡的原地踏步史06(◐‿◑)

2024-07-10 23:56:12 208

原创 菜鸡的原地踏步史05(◐‿◑)

改掉自己想到哪写哪的坏习惯。// 双端队列,超时。

2024-07-09 12:17:14 128

原创 菜鸡的原地踏步史04(◐‿◑)

改掉自己想到哪写哪的坏习惯。合并K个升序链表朴素写法。贪心解题有样例过不去。

2024-07-07 23:20:51 126

原创 菜鸡的原地踏步史03(◐‿◑)

改掉自己想到哪写哪的坏习惯。

2024-07-06 12:11:57 237

原创 菜鸡的原地踏步史02(◐‿◑)

改掉自己想到哪写哪的坏习惯。

2024-07-05 22:30:16 233

原创 菜鸡的原地踏步史(◐‿◑)

leetcode启动!(什么破代码又臭又长 (┙>∧<)┙へ┻┻)尝试改掉想到哪写哪的代码坏习惯。

2024-07-05 11:22:19 189

原创 背包问题套路模板

dp[i][j] – 容量为j的背包,在前i个物品中装,最多能装多少价值。N – 物品数目, W – 物品重量 V – 物品价值。

2024-07-01 23:17:11 144 2

原创 代码随想录系统性一刷总结

指针思想很重要day01 二分查找+移除元素day02 数组平方+长度最小子数组+螺旋矩阵II。

2024-04-21 11:27:48 773

原创 Day60 单调栈 part03

感觉和接雨水差不多,只需要多考虑一些情况。

2024-04-20 23:22:25 315

原创 Day59 单调栈 part02

然后看了题解,原来只需要遍历的时候nums扩展成两倍长度,然后 i --> i % nums.length就行了。我一开始的做法是 基本沿用”下一个最高温度“的思路,然后遍历两遍,第二遍从头循环遍历更新。感觉放在下一个最大元素/下一个最高温度,这类型的题目里面,肯定要用到下一个最xx的数组。但是这种做法,总有用例通不过,因为循环变量更新的值可能不是下一个最近的更大元素。其中while循环的含义。但是没有更进一步的想法。

2024-04-19 10:56:07 332

原创 Day58 单调栈

栈存储当前最大的temp[peek],等下一个更高的temp[i]出现时,弹出,并记录此时的位置peek,计算(i - peek)并存入res数组(如果弹出后,temp[i]还是比temp[peek]大,继续记录peek、保存进res、弹出)类似上一题,先建立一个hashmap,存nums2的下一个更大的元素。看完题解,明白了栈的作用 --> 将时间复杂度优化到 O(n)然后遍历其子集nums1的时候,直接从hashmap中取值即可。如果temp[i]都比temp[peek]小,则一直入栈。

2024-04-18 09:44:46 254

原创 Day57 动态规划 part17

这里for循环遍历时,j从i + 1开始,跳过了长度为2的字符串判断,使得当sc[i] == sc[j]时,统一 + 2。长度>2,判断去掉首尾后的子串dp[i + 1][j - 1]是否也是回文子串(这就要求我们从下往上,从左往右遍历)这次不用true、false以及count计数,用dp[i][j]表示回文子串长度。这次的dp[i][j]含义是字符串从 i 到 j 是否为回文字符串。初始化dp数组dp[i][i]为1(单个字符一定为回文)长度为1 or 2,必然为回文串。这道题可以参考上面题的思路。

2024-04-17 10:52:45 290

原创 Day56 动态规划 part16

需要特别注意的是,这道题是增or删or换,比较时需要考虑的情况多一些。(最近心态不好,一些测试题感觉戳中自己内心,也记录一下吧。这次是求删减最小次数,状态转移方程是比小。感觉跟前两天子序列差不多,但是又有差别。和上一题思路一致,初始化一模一样。word1改成word2。

2024-04-16 19:58:28 343

原创 Day55 动态规划 part15

dp[i][j] = dp[i - 1][j - 1] + 1 --> 现在不是+1,是 + dp[i][j - 1]所以这道题我的dp定义为dp[t.length() + 1][s.length() + 1]跟上一题代码其实差不多,但是现在s是母串,t是待匹配的子串。跟上一题状态转移方程几乎差不多。= j(字符串不相等时)i == j(字符相等时)自己还是只能想到双指针法。如果用动态规划的思想解题。

2024-04-15 18:55:41 427

原创 Day53 动态规划 part14

那么dp[nums1.length][nums2.length]就是nums1的元素和nums2最长不相交子序列长度,也就是我们需要的结果。对着状态转移方程写代码即可,还是需要注意,i, j是从1开始的,比较的时候是str1[i -1]和str2[j - 1]这道题代码和上一题几乎一样,不过,只要取出dp[nums1.length][nums2.length]就是最终答案了。模仿昨天的最大重复子序列长度的思路,可以列出如下状态转移方程。dp[i]表示的含义是当前位置之前连续数组的最大和。

2024-04-13 15:32:18 529

原创 Day52 动态规划 part13

这次初始化dp数组为全1,确定当前位置 i 的值,用 j 从0到 i 遍历,只要nums[j] < nums[i],当前dp[j] + 1,并与dp[i]比较取最大。惊觉初始化dp数组可以直接dp = [1] * nums.length(学的都扔给韩老师了。只是dp要设置成nums1+1 * nums2 +1长度,在遍历的时候要注意是i还是i - 1。状态转移方程是dp[i] = Math.max(dp[i], dp[j] + 1)状态转移方程dp[i] = dp[i - 1] + 1。

2024-04-12 10:02:53 367

原创 Day51 动态规划 part12

手里有股票,可能是冷冻期结束买的dp[i - 1][3] - prices[i],可能是正常时间买的dp[i - 1][1] - prices[i],比较大小,再和此状态下自身dp[i - 1][0]比较。手里没股票,是冷冻期dp[i - 1][3],再和此状态下自身dp[i - 1][1]比较。手里没股票,是正常卖出去了dp[i - 1][0] + prices[i]冷冻期,状态等于前一天的状态dp[i][3] = dp[i - 1][2]

2024-04-11 08:02:23 470

原创 Day50 动态规划 part11

状态方程 dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i])状态方程 dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i])和上一题代码一样,只是这题给定了最大交易次数k,只要把上一题的max换成k就行。dp[i][j][0] – 第i天结束时,交易j次,手里没有股票。dp[i][j][1] – 第i天结束时,交易j次,手里有股票。

2024-04-10 08:18:05 274

原创 Day49 动态规划 part10

这道题再次出现在动态规划里面,这题的代码跟上一题几乎一样,状态转移dp[i][1]不再是dp[i][1] = Math.max(dp[i - 1][1], -prices[i]);因为股票可以多次买入卖出,状态转移方程为dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);用的profit累加,只要后一天price大于前一天的,就购买并卖出,并计算profit。定义dp数组,dp[i][0]表示卖出,dp[i][1]表示买入。

2024-04-09 09:18:28 263

原创 Day48 动态规划 part09

由于状态转移方程从i - 2开始,先给dp前两个数赋值,i = 0时,dp[0] = nums[0],dp[1] = Math.max(nums[0], nums[1])只能跟着代码的思路,递归遍历是左右中,从叶子结点向上回溯,叶子结点dp[1] = left[0] + right[0] + node.val = node.val;

2024-04-08 11:38:18 417

原创 Day46 动态规划 part08

这次的状态方程,dp[j] && word.contains(s.substring(j, i)),如果dp[j] 在字典里面,且j - i也在字典里面,dp[i] 就也在字典里面。

2024-04-06 21:34:14 202

原创 Day45 动态规划 part07

这次的状态转移方程是dp[i] = Math.min(dp[i], dp[i - j *j] + 1),比较自身与dp数组中i - j *j与j *j的组合(该情况的组合数就是dp[i - j *j] + 1)这里为了方便比较(存在无法组合输出-1的情况),比较更小值的时候,没有用Integer.MAX_VALUE,用的amount + 1。状态转移方程模仿可以写出,dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1)和昨天的组合总和题几乎一模一样的代码。

2024-04-06 08:06:46 332

原创 Day44 动态规划 part06

正当我想开始默写模板dp[j] = Math.max(xxx, xxx)的时候。自信对题解,发现这次是dp[i] = dp[i] + dp[i - num]由于前几天的题看题解看代码都是看的一维数组,这次我用了一维数组解决。和第一天接触的背包问题一样。

2024-04-05 13:15:29 188

原创 Day43 动态规划 part05

这个状态转移方程是dp[i][j] = Math.max(dp[i][j], dp[i - zeroCount][j - oneCount] + 1),而且是在for循环里面更新。上面其实可以总结为,一维背包问题,其中 dp[j] = dp[i] + dp[j - nums[i]]就是状态转移方程。经历了这些个题之后,我发现我要的都是dp[target],要么取值,要么计算,要么判断。这道题又出现了dp[j] = dp[j - nums[i]] + xxx。代码就是划分和相同的子集的变形。

2024-04-03 23:00:17 574

原创 Day42 动态规划 part04

题解思路应该是,数组之和的一半sum(nums)/2,dp数组是长度为 sum(nums)/2 + 1(总结规律,size + 1),从后向前(不一样了)不断比较并且更新最大值,如果dp数组最后一个值 == sum(nums)/2,那么就说明可以划分成两个和相等的子集。总结规律就是,dp数组要比原来各个size + 1,dp[i][j] = Math.max(xxx, xxxx(根据题目情况进行各种处理))不管怎么样,模板是一把子背住了。笑死,已经学会抢答了!

2024-04-03 21:13:54 387

原创 Day41 动态规划 part03

拿代码debug,dp数组,表示正整数n的最大拆分乘积,当n = 2的时候才能拆分,且dp[2] = 1,用 i 记录当前dp[i],用 j 将 i 从1到 i - 1 进行拆分,比较并更新dp[i]的值。好好好,我是只会写int[] dp = new int[n+1]的菜鸡。有dp[i] 有dp[i - j];这两题学会了双重for循环,啥也不会就这么写了。

2024-04-01 16:11:46 202

原创 Day39 动态规划 part02

需要想到dp[i][j] = dp[i - 1][j] + dp[i][j - 1],以及初始化mxn矩阵,第一行和第一列均初始化为1。遍历的时候,当遇到1,应该continue,想当然以为是break。在上一题的基础上,考虑obstacleGrid数组中出现1的情况。第一行和第一列赋值1的时候 要注意,只要出现一个1,后面都不考虑。

2024-03-31 23:19:40 377

原创 Day38 动态规划

还是和斐波那契数列类似,需要注意的是,dp要比cost数组长一个单位,要计算的是dp最后一个单位可能最小值。看了题解才明白本质上还是第一题的斐波那契数列(可能这种题目需要自己列举找规律。

2024-03-31 10:45:53 350

原创 Day37 贪心 part06

一开始的思路只从后向前遍历调整arraylist,100的案例没过,应该输出99,我输出90,顿时联想到分糖果问题,果断加了从前向后检查调整的遍历,没问题。对着代码理解了一下,开始还不理解有覆盖为什么返回2,然后发现只是卡哥标记的一种节点状态。

2024-03-29 03:06:31 323

原创 Day36 贪心 part05

仍然是模仿无重叠区间的代码,需要注意这里根据数组start值排序(不考虑start比小,只比较end谁大),去更新end。遍历string,当前字符串位置 i 的字母就是其出现的最后一个位置时,从此处划开这个字符串,将长度存进结果。直接利用最少箭射气球的代码,得到重叠区域数,无重叠的区间数即 = 总区间数 - 重叠区间数。当前start还比上一个end大时,两数组比如不重叠,加进结果数组,更新start和end。先存一个数组,保存string字符串中的每个字母出现的最后一个位置。

2024-03-27 23:44:46 225

原创 Day35 贪心 part04

类似分糖果,people[i] = [hi, ki] 如果身高h相同,k按照从小到大排序,否则按照身高h从高到低排序。需要注意的是,对point进行排序的时候,是按end值进行从小到大排序。只要逐个考虑bills数组可能的数字 5/10/20,分别考虑。

2024-03-27 20:28:04 256

原创 Day34 贪心 part03

首先初始化candy为1,先从前往后遍历,如果rating后一个值大于前一个值,candy数 + 1;接着从后往前遍历,如果rating大于后一个值,比较自身candy数和后一个candy + 1,取较大值。又需要考虑最大值,首先将数组进行排序,将数字中所有<0的全部取反,如果此时k还要剩余,剩余偶数的话,可以反复对数组其中一个数字取反,最终数组仍然不变;对着题解理解,只要gas比cost大,就能找到起始位置;而这个起始位置,只要索引 i 位置上gas < cost,就不断后移更新。没想到如何用贪心思想。

2024-03-25 10:54:19 377

原创 Day32 贪心算法 part02

想简单了,没有考虑到step指的是最大跳跃格数,可以跳小,[2, 5, 0, 0] 这个例子过不去。把当前i下一个最大跳转数记录下来,当到了该位置的时候,进行跳转并计数。后来还是老实按照题解,先把maxJump算出来,和当前i进行对比。只有当后一天比前一天价格高时,才出售,profit才累加。

2024-03-24 11:51:27 384

空空如也

空空如也

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

TA关注的人

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