自定义博客皮肤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)
  • 收藏
  • 关注

原创 代码随想录二刷 Day05 | 242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和,454.四数相加II,383. 赎金信

用哈希表记录元素值及其对应的下标,但是这里有个小技巧,遍历时在哈希表中记录的不是当前元素值和其下标,而是target减去当前元素后的值和当前元素的下标,这样,往后遍历时,就可以直接通过containsKey判断当前元素是否在哈希表中,如果在,就直接得到前一个元素的下标和当前的下标,返回即可。初始化本轮用于计算的数字num=n,用set记录每一次计算得到的平方和,当num不为1时,计算其每一位上的平方和,得到sum,如果sum不在set中,就把它加入set,否则说明已经出现了循环,该数不是快乐数。

2024-05-29 22:38:16 822

原创 代码随想录二刷 Day04 | 203.移除链表元素,206.反转链表,24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,160.链表相交,142.环形链表II

Java中,链表定义如下主要注意一下构造函数如何书写数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。链表是通过指针域的指针链接在内存中各个节点。数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。

2024-05-28 23:37:49 683

原创 代码随想录二刷 Day03 | 209.长度最小的子数组,904.水果成篮,76.最小覆盖子串,59.螺旋矩阵II,54.螺旋矩阵

代码随想录题解:​​​​​​​。

2024-05-27 23:36:40 620

原创 代码随想录二刷 Day02 | 27. 移除元素,26.删除排序数组中的重复项,283.移动零,844.比较含退格的字符串,977.有序数组的平方

每次循环的时候,比较left和right指针对应的数字大小,将更大的那个放入结果数组中,指针再前进,直到所有数字遍历结束。2. Java的String是不能修改的,所以不像c++可以直接当数组用那么方便,这样做空间效率只能是O(n),跟用栈来做相比,减少了出入栈的过程,时间省下一些。1. 对于数组问题,如果时间复杂度要求较高,双指针是非常常用的方法,但是具体怎么指,是快慢指针,还是两头指针,或是后面的滑动窗口这样的指针,需要根据题目分析。leetcode题解:​​​​​​​。

2024-05-24 18:42:41 709

原创 代码随想录二刷 Day01 | 704. 二分查找,35.搜索插入位置,34.在排序数组中查找元素的第一个和最后一个位置,69.x 的平方根,367.有效的完全平方数

题目链接:​​​​​​​34.在排序数组中查找元素的第一个和最后一个位置代码随想录题解:​​​​​​​34.在排序数组中查找元素的第一个和最后一个位置。

2024-05-23 16:49:09 544

原创 代码随想录算法训练营第六十四天 | 总结

美中不足的一点是做题之前可能已经被题目标题剧透了要用的方法,不利于自己先思考,二刷的时候可以提前把题号copy下来避免这个问题。这次花了钱效果就是不一样,其实写到后期已经成习惯了,不用每天督促也可以自己主动写作业,21天养成一个好习惯诚不欺我。为期两个月的训练营终于结束了,对于自己能从头到尾坚持下来非常满意,虽然中间经历了一些忙碌导致没有当天打卡的情况,但基本都是按时完成了,很不错。写博客是个好方法,有助于重新缕清思路,复盘自己的问题,加深印象。后续二刷的时候仍然要坚持写。

2024-05-09 23:31:47 150

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

看答案,不为难自己 重点还是怎么将应用题翻译成数学题,才能选择合适的做法。 要求最大的矩形,其实就是以某一个最低高度为矩形的高,将其周围不小于它的高度的柱子宽度加在一起,作为矩形的宽。这样翻译过来,就是要求每一个高度左边和右边第一个高度小于它的下标,这样,左右下标之间的柱子就是矩形的宽度。 与接雨水的题稍微有点反过来,略复杂了一些。 1. 双指针法 遍历两遍heights,分别计算其每个下标左边第一个高度小于它的下标minLeftInde

2024-05-09 20:57:45 344

原创 代码随想录算法训练营第六十二天| 503.下一个更大元素II,42. 接雨水

其高度为左右高度最小值减去凹槽高度,凹槽高度mid = height[s.peek()],弹出栈顶元素后,如果栈不为空,则得到左边高度height[s.peek()],右边高度为height[i],则储水高度为h = Math.min(height[s.peek()],height[i]) - height[mid],宽度为w = i - s.peek() - 1,体积为h*w,将其加到储水量中即可。1. 当前元素高度小于栈顶元素高度,直接入栈。代码随想录题解:​​​​​​​。题目链接:​​​​​​​。

2024-05-08 16:39:36 1001

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

否则,先检查栈顶对应元素nums2[s.peek()]在nums1中是否存在,即map中是否存在key为nums2[s.peek()],如果不存在则直接弹出,存在则取出栈顶元素在nums1中对应的下标index = map.get(nums2[s.peek()]),然后更新结果数组res[index] = nums2[i],表示此时nums2[i]是nums1[index]对应的nums2中右边第一个比它大的数。学习了一下单调栈的用法,很绕很妙。代码随想录题解:​​​​​​​。题目链接:​​​​​​​。

2024-05-08 11:39:54 506

原创 代码随想录算法训练营第六十天| 647. 回文子串,516.最长回文子序列,动态规划总结篇

思路跟前一题的二维dp算法有点类似,如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况。

2024-05-08 00:36:02 690

原创 代码随想录算法训练营第五十六天| 583. 两个字符串的删除操作 ,72. 编辑距离,编辑距离总结篇

因为 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2,所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);替换元素:word1[i-1] = word2[j-1]时,dp[i][j] = dp[i-1][j-1],那么要通过替换元素使word1[i-1] = word2[j-1],只需要在dp[i-1][j-1]的基础上增加一次替换操作即可,即dp[i][j] = dp[i-1][j-1]+1。

2024-04-29 23:23:40 546

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

t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];其实这里 大家可以发现和。

2024-04-29 18:41:07 754

原创 代码随想录算法训练营第五十三天| 1143.最长公共子序列 ,1035.不相交的线,53. 最大子序和 动态规划

代码随想录题解:​​​​​​​。

2024-04-28 23:05:45 872

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

代码随想录题解:​​​​​​​。

2024-04-27 23:22:11 694

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

这题跟买卖股票II几乎一样,就是在卖出状态时,如果卖出了股票,需要增加一个手续费,即dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i] - fee)。写dp[i][0]递推公式的时候一开始思路不清晰写成了dp[i-1][0] - prices[i],这肯定不对,要牢记卖出后才能买入,必然用dp[i-1][1] - prices[i]来递推。转移到状态2有两种情况:前面没有冷冻,保持卖出状态不变,不买不卖(状态2->2);

2024-04-26 01:16:11 892

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

代码随想录题解:​​​​​​​。

2024-04-25 00:12:50 465

原创 代码随想录算法训练营第四十九天| 121. 买卖股票的最佳时机, 122.买卖股票的最佳时机II

同样,如果不持有股票,要么是之前已经卖出,持有现金dp[i-1][1],要么是当前股票卖出,则上一回必须买入,当前持有现金为dp[i-1][0]+prices[i]。设置一个窗口i,j,其中prices[i]是当前窗口的最小值,j从i+1开始遍历,如果prices[j] > prices[i],计算profit = Math.max(prices[j] - prices[i], profit),否则更新i=j,开始遍历新的窗口。代码随想录题解:​​​​​​​。题目链接:​​​​​​​。

2024-04-23 00:10:38 764

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

代码随想录题解:​​​​​​​。

2024-04-22 19:01:48 1018

原创 代码随想录算法训练营第四十六天| 139.单词拆分,关于多重背包,你该了解这些!, 背包问题总结篇!

由于是排列,所以应该先遍历背包(i),后遍历物品(j),递推公式为:当dp[j]为true,表示字符串长度为j时存在单词组合,所以只需要查询substr(j,i)的子字符串是否在单词数组中存在,存在则将当前dp[i]置为true。多重背包就是01背包的升级版,只要把多个重量和价值相同的物品当作01背包里面多个不同的物品就可以了,同样用01背包的思路来做,只不过遍历的时候要多加一个对物品数量的遍历。所以这题,dp数组表示当字符串长度为dp[i]时,是否存在符合条件的单词组合,存在则为true。

2024-04-21 22:07:14 562

原创 代码随想录算法训练营第四十五天| 70. 爬楼梯 (进阶),322. 零钱兑换 ,279.完全平方数

代码随想录题解:​​​​​​​。

2024-04-19 22:17:45 671

原创 代码随想录算法训练营第四十四天| 完全背包,518. 零钱兑换 II ,377. 组合总和 Ⅳ

代码随想录题解:​​​​​​​。

2024-04-18 23:04:57 285

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

一开始想用二维数组解决,用两重循环,实际上就是求累加和,如果上一行dp[i-1][j+nums[i]]或dp[i-1][j-nums[i]]存在,下一行就直接累加即可。但是这样做存在一些问题,当nums中存在0时会出错,nums中只有一个数字好像也不对,估计是初始化的锅,先把错误答案放着,后面有机会再看看怎么改。那就转变为,对石块总数求和sum,背包大小为sum/2,有价值和重量都为nums[i]的石块装入背包,如何装价值最大。代码随想录题解:​​​​​​​。题目链接:​​​​​​​。

2024-04-18 16:16:39 355

原创 代码随想录算法训练营第四十二天| 01背包问题,你该了解这些!, 01背包问题,你该了解这些! 滚动数组, 416. 分割等和子集

dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i,一个是取dp[j - weight[i]] + value[i],即放物品i,指定是取最大的,毕竟是求最大价值,所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j],那么dp[0]就应该是0,因为背包容量为0所背的物品的最大价值就是0。

2024-04-17 23:32:07 920

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

那么如果dp[i]定义为数字i的最大乘积和,那么对于dp[i],遍历j from 1 to i - 1, 递推公式为求dp[i-j]*j和j * (i - j) 中的最大值。还需要注意,初始化的方式是跟着定义走的,如果求的是max(dp[i - j] * dp[j]),为了计算正确,初始化的结果会跟dp[i]定义不符,容易出错。题目要求用1-n的数字构成不同的二叉搜索树,其实可以分解为,0-j-1的数字构成左子树,j为根节点,j到i构成右子树,那么。初始化dp[0]=dp[1]=0即可。

2024-04-16 17:23:06 481

原创 代码随想录算法训练营第三十九天| 62.不同路径,63. 不同路径 II

确定递推公式:由于只能向右或向下走,那么要走到当前坐标,必然是从当前坐标的上面或左边走过来的,所以路径总数就是走到上面坐标的路径数加上走到左边坐标的路径数,一共有dp[i][j] = dp[i-1][j] + dp[i][j-1]个,但是如果当前点就有障碍,该点无法到达,dp[i][j]=0。一开始想错了一个地方,把不可达的点的dp设置为-1了,跟自己一开始的定义其实矛盾了,导致后面计算的时候多写了很多的判断条件,而且这里有两个数组,写条件的时候一开始也写混了,导致各种小错误堆积出了很多怪错误。

2024-04-13 11:33:25 826

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

动态规划五步曲。

2024-04-12 16:23:02 705

原创 代码随想录算法训练营第三十七天| 738.单调递增的数字,968.监控二叉树,总结

看过思路以后,一开始想用StringBuilder接收n,然后修改其中的参数,但是不知道为什么setCharAt(i)的时候先读取字符再对其进行-1处理数据类型会变成int,也不知道如何变回char,最后还是老老实实用string数组接收n了,java在字符串处理这一块不是特别好用。其实逻辑非常单纯,依次从数字的末尾开始往高位比较,如果不符合单调递增的原理,就把当前位的数字减一,同时把后面的所有数字都变成9,一定是最大的数。一开始想复杂了,赋值的时候就手忙脚乱,看答案了。题目链接:​​​​​​​。

2024-04-11 22:33:15 306

原创 代码随想录算法训练营第三十六天| 435. 无重叠区间,763.划分字母区间,56. 合并区间

先不提算法,假设手动计算区间划分,做法应该是:首先记录第一个字母第一次出现的位置和最后一次出现的位置,然后再从第一个字母最后一次出现的位置出发,记录第二个字母最后一次出现的位置,然后取这两个最后一次出现位置的较大值,更新本次分割的终点,然后再对第三个、第四个。如果有重合,则需要移除的区间数目加一,右边界更新为当前区间和右边界之间的较小值。求无重叠区间,要返回需要移除区间的最小数量,使剩余区间互不重叠,相当于有区间重叠时,只能保留其中一个区间,且为了保证最后能保留的区间尽可能多,保留的区间要尽可能小。

2024-04-10 23:46:14 565

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

代码随想录题解:​​​​​​​。

2024-04-09 17:05:43 663

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

代码随想录题解:​​​​​​​。

2024-04-09 00:30:55 499

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

把股票的趋势图画出来,会得到一个有起伏的折线,如果每次都能在波谷买进,波峰卖出,收益必然最大。这个过程又可以分解到每一天,只要第二天的收益比第一天多,就可以第一天买进第二天卖出,即使连涨几天,比如第一天买进,波峰在第四天,那么第一天买进第四天卖出,和第一天买,第二天卖,第二天买,第三天卖,第三天买,第四天卖的结果是一样的。很巧妙的方法,一边遍历一边更新可遍历的最大范围,直到遍历的最大范围达到数组上限,则为true。代码随想录题解:​​​​​​​。题目链接:​​​​​​​。题目链接:​​​​​​​。

2024-04-07 19:04:17 624

原创 代码随想录算法训练营第三十一天| 理论基础,455.分发饼干, 376. 摆动序列,53. 最大子序和

如果当前饼干不能满足当前小孩胃口,就继续看下一个饼干是否能满足,否则已满足胃口的小孩数量加一,继续看下一个饼干能否满足下一个小孩的胃口。这样写,即使所有的sum都小于0,最后得到的也一定是数组中最大的数,即最靠近0的负数。这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。也可以换一个思路,小饼干先喂饱小胃口,也就是我写的思路。局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

2024-04-05 21:26:52 357

原创 代码随想录算法训练营第三十天| 332.重新安排行程, 51. N皇后, 37. 解数独,总结

针对第一个难点,可以提前对tickets进行排序,利用list.sort方法重写其中的comparator,排序的key为tickets里面每一张ticket的目的地,也就是tickets.get(i).get(1),这样保证有结果时,第一个结果一定是升序最小。针对第二个难点,这里是树枝的去重问题,所以可以用一个usedTickets数组,记录每一张ticket的使用情况,用过就设置为true,保证不会重复使用。从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。

2024-04-05 11:15:24 616

原创 代码随想录算法训练营第二十九天| 491.递增子序列,46.全排列,47.全排列 II

回溯三部曲:参数为result,list,nums,和用于记录当前树枝元素使用情况的数组used,由于nums[i]仅仅在-10到10之间,且nums[i]中的元素不会重复,所以used可以初始化为21个全0元素;单层遍历逻辑为,对于nums中的所有元素,如果used[nums[i]+10]被用过,直接跳过当前循环,否则将其加入list,调用回溯函数继续遍历nums,出来后将list最后一个元素弹出即可。参数为result,list,nums,和用于记录当前树枝元素使用情况的数组used;

2024-04-04 22:46:43 549

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

递归三部曲逻辑也很简单,参数同样有result,list,startIndex,这里不需要终止条件,因为终止条件实际上是startIndex>=nums.length,与后面单层遍历的边界条件相同,所以每次一进入回溯函数就直接将当前list加入result再返回即可,单层遍历只需要每次将当前nums[i]加入list,并用startIndex=i+1调用递归函数,出来时弹出nums[i]即可。这题就是在上一题的基础上,加了去重的操作,而去重的题目在之前做组合的时候也做过了,所以函数都是非常简单的。

2024-04-04 12:17:07 747

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

参数有返回的结果result,中间记录结果的变量list,用于计算当前数字之和的变量sum,递归函数的入参是输入的数组candidates,目标和target,以及每一次递归的起始值startIndex;都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。组合总和这一类题的基本思路是一样的,这道题是在组合总和III这题的基础上,增加了一个元素可重复选取的需求,实际上正如提示所说,只要修改startIndex的入参即可。

2024-04-01 22:41:44 1000

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

代码随想录题解:​​​​​​​。

2024-03-31 09:50:06 797

原创 代码随想录算法训练营第二十四天| 理论基础,77. 组合

当然,考虑到如果从startIndex到n的元素数目不足k,那么就算循环结束这个path也不会被使用,浪费了时间,可以提前剪枝,因此循环中i的上限设置为n - (k - path.size()) + 1 ,注意path.size()是小于等于k的。每次循环的起始值startIndex就是取1,2,3...的操作,而终止条件就是当前循环的一个符合条件的list已经满了,达到了叶子节点,将结果塞入result的list后,还需要将list最末尾的节点弹出,方便下一次操作。对于这道题,其N叉树为。

2024-03-29 21:46:43 891

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

递归体为:如果low > high,返回空,如果low=high,返回值为nums[low]的新节点,剩下的情况里,将数组一分为二,取得根节点的位置indexRoot = (low+high)/2,再递归的将数组左边的数和右边的数分别传入递归函数,得到左右子树的结构。那么在构造的时候,就要尽量让左右子树中含有的节点数量不要相差太大,所以每次把数组最中间的节点当作根节点最好,这样也符合二叉搜索树的要求,即左边的数小于根节点,右边的数大于根节点。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

2024-03-29 00:48:14 740 1

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

代码随想录题解:​​​​​​​。

2024-03-28 15:52:01 525 1

空空如也

空空如也

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

TA关注的人

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