自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法刷题day36|动态规划:188. 买卖股票的最佳时机 IV、309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费

那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);1.dp数组以及下标的含义:dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。即:dp[i][2] = dp[i - 1][0] + prices[i];昨天一定是持有股票状态(状态一),今天卖出。只是在股票2 的基础上减去手续费。由股票3的两次拓展至k次。昨天卖出了股票(状态三)

2024-08-16 10:28:09 144

原创 算法刷题day35|动态规划:121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II、123. 买卖股票的最佳时机 III

同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?

2024-08-15 10:53:23 535

原创 算法刷题day34|动态规划:198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III

2.递推公式:如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。3.初始化:dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房。通过递归左节点,得到左节点偷与不偷的金钱。

2024-08-14 10:48:14 457

原创 算法刷题day33|动态规划:322. 零钱兑换、279. 完全平方数、139. 单词拆分

2.递推公式:凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j]3.初始化:首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。所以下标非0的元素都是应该是最大值。4.遍历顺序:本题求钱币最小个数,。

2024-08-13 10:45:47 360

原创 算法刷题day32|动态规划:52. 携带研究材料、518. 零钱兑换 II、377. 组合总和 Ⅳ、57. 爬楼梯

完全背包的物品是可以添加多次的,所以要从小到大去遍历。本题要求凑成总和的组合数,元素之间明确要求没有顺序。本题是求凑出来的方案个数,且每个方案个数是为组合数。所以纯完全背包是能凑成总和就行,不用管怎么凑的。01背包和完全背包唯一不同就是体现在遍历顺序上。

2024-08-08 10:39:50 142

原创 算法刷题day31|动态规划:1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

1.dp数组以及下标的含义:石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为dp[j]”dp[j]其他下标对应的数值也应该初始化为0,从递推公式也可以看出,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。3.初始化:dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递推结果将都是0。

2024-08-07 15:23:41 1050

原创 算法刷题day30|动态规划:46. 携带研究材料、416. 分割等和子集

在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。2.一维dp数组的递推公式dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i,一个是取dp[j - weight[i]] + value[i],即放物品i。

2024-08-07 15:08:56 798

原创 算法刷题day29|动态规划:62. 不同路径、63. 不同路径 II、343. 整数拆分、96. 不同的二叉搜索树

所以递推公式:dp[i] += dp[j - 1] * dp[i - j];所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]因为从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。

2024-08-05 16:27:19 700

原创 算法刷题day28|动态规划:509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

【代码】算法刷题day28|动态规划:509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯。

2024-08-03 10:13:11 199

原创 算法刷题day27|56. 合并区间、738. 单调递增的数字

例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。如果没有合并就把原区间加入到result数组。即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。按照左边界从小到大排序之后,如果。

2024-08-02 10:23:50 183

原创 算法刷题day26|452. 用最少数量的箭引爆气球、435. 无重叠区间、763. 划分字母区间

只射重叠最多的气球,用的弓箭一定最少,当前重叠了三个气球,我射两个,留下一个和后面的一起射这样弓箭用的更少的这种情况。局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。此时前面出现过所有字母,最远也就到这个边界了。在遍历的过程中相当于是要找每一个字母的边界,

2024-08-01 11:01:47 171

原创 算法刷题day25|贪心:134. 加油站、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列

排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]

2024-07-31 15:23:13 935

原创 算法刷题day24|贪心:122. 买卖股票的最佳时机 II、55. 跳跃游戏、45. 跳跃游戏 II、1005. K 次取反后最大化的数组和

i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。而 cover 每次只取。

2024-07-30 15:47:00 393

原创 算法刷题day23|贪心:455. 分发饼干、376. 摆动序列、53. 最大子数组和

从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0。我们采用,删左面三个 2 的规则,那么 当。

2024-07-29 15:21:03 669

原创 算法刷题day22|回溯:491. 非递减子序列、46. 全排列、47. 全排列 II

本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。这里的set定义在for循环之前,所以在每层回溯的时候都会重置set。可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。。

2024-07-27 10:59:43 364

原创 算法刷题day21|回溯:93. 复原 IP 地址、78. 子集、90. 子集 II

【代码】算法刷题day21|回溯:93. 复原 IP 地址、78. 子集、90. 子集 II。

2024-07-26 10:00:36 137

原创 算法刷题day20|回溯:39. 组合总和、40. 组合总和 II、131. 分割回文串

例如,candidates = [1, 1, 2], target = 3,遍历第一个 1 时,会取到[1, 2],遍历到第二个 1 时,也会取到[1, 2],此时就要对同一树层上的相同的值去重。要将翻转值写进去的string必须有一定的长度。主要是判断回文串的方法不同。

2024-07-25 11:18:29 503

原创 算法刷题day19|回溯:77. 组合、216. 组合总和 III、17. 电话号码的字母组合

回溯的本质是穷举,穷举所有可能然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。

2024-07-24 14:53:16 285

原创 算法刷题day18|二叉树:669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

如果结点的值小于 low,那么说明该结点及它的左子树都不符合要求,我们返回对它的右结点进行修剪后的结果;如果结点的值大于 high,那么说明该结点及它的右子树都不符合要求,我们返回对它的左子树进行修剪后的结果;如果结点的值位于区间 [low,high],我们将结点的左结点设为对它的左子树修剪后的结果,右结点设为对它的右子树进行修剪后的结果。

2024-07-23 15:42:43 420

原创 算法刷题day17|二叉树:235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

因为是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是p 和 q的公共祖先。那问题来了,?如图,我们从根节点搜索,第一次遇到 cur节点是数值在[q, p]区间中,即 节点5,此时可以说明 q 和 p 一定分别存在于 节点 5的左子树,和右子树中。

2024-07-22 10:55:46 809

原创 算法刷题day16|二叉树:530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先

自己最开始写的时候忘记了题目的要求是二叉搜索树,直接用了层次遍历,把每个元素值存到vector中,然后就最小的差值,当然这种方式适用于所有二叉树。定义双指针:cur当前遍历节点,pre当前遍历节点的前一个节点。

2024-07-20 11:12:53 315

原创 算法刷题day15|二叉树:654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树

和昨天的根据前序、中序构建二叉树思路一样。

2024-07-19 11:06:41 316

原创 算法刷题day14|二叉树:513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树

中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。中序数组相对比较好切,找到切割点(后序数组的最后一个元素)在中序数组的位置,然后切割,坚持左闭右开的原则。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点。第五步:切割后序数组,切成后序左数组和后序右数组。

2024-07-18 16:00:50 419

原创 算法刷题day13|二叉树:222. 完全二叉树的节点个数、110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和

分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。先求左子树和右子树的节点个数,最后左右子树的节点个数相加,再加1(根节点),即是整个完全二叉树的节点个数。

2024-07-17 15:38:49 251

原创 算法刷题day12|二叉树:226. 翻转二叉树、101. 对称二叉树、104. 二叉树的最大深度、111. 二叉树的最小深度

来判断根节点的左子树和右子树的内侧和外侧是否相等(比较的是两个子树的里侧和外侧的元素是否相等。

2024-07-16 15:45:58 235

原创 算法刷题day11|二叉树:遍历方法总结

【代码】算法刷题day11|二叉树:遍历方法总结。

2024-07-15 15:50:08 124

原创 算发刷题day10|栈和队列:150. 逆波兰表达式求值、239. 滑动窗口最大值、347. 前 K 个高频元素

template<class T,

2024-07-13 17:12:22 801

原创 算法刷题day09|栈与队列:232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

数据存取://向栈顶添加元素pop();//从栈顶移除第一个元素top();//返回栈顶元素empty();//判断堆栈是否为空size();//返回栈的大小//往队尾添加元素pop();//从队头移除第一个元素back();//返回最后一个元素front();//返回第一个元素empty();//判断堆栈是否为空size();//返回栈的大小//判断容器是否为空//返回容器中元素的个数//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

2024-07-12 16:50:53 1031

原创 算法刷题day08|字符串:151. 反转字符串中的单词、卡码网55. 右旋字符串

【代码】算法刷题day08|字符串:151. 反转字符串中的单词、卡码网55. 右旋字符串。

2024-07-11 11:16:05 173

原创 算法刷题day07|字符串:344. 反转字符串、541. 反转字符串 II、卡码网54. 替换数字

当k <= s.size() && s.size() < 2 * k时,只反转前k个;当长度大于2k时,以每2k个为一组反转前k个,末尾余量最后单独判断。不等关系要采用链式写法:k <= s.size() && s.size() < 2 * k,不能写成:k <= s.size() < 2 * k,但是就是这个细节导致代码迟迟没有AC。reverse函数的用法:1.reverse(s.begin(),s.end());

2024-07-10 15:24:05 344

原创 算法刷题day06|哈希表:454. 四数相加 II、383.赎金信、15.三数之和、18.四数之和

统计ransomNote中各个字母出现的次数,遍历magazine,如果ransomNote的字母出现在magazine中,则arr对应减减,若最后arr的元素都为0,则成功。(其实ransomNote是magazine的子集关系)

2024-07-09 16:53:23 264

原创 算法刷题day05|哈希表:242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

先把两个数组的元素排序,然后比较出长度较小的数组,将长度较小的数组的各个元素在较长数组中依次查找,然后存入结果集。在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。这道题 我们需要 给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。

2024-07-08 16:06:05 605

原创 算法刷题day04|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142. 环形链表 II

在链表的题目中,最常用的几个方法是设置dummy虚拟节点,(快慢)双指针,迭代法,哈希法。设置dummy节点可以令其指向head节点,也可以指向null(反转链表),具体情况根据题目而定。cur当前节点一般设置在要操作的节点之前,此外,设置临时节点temp可以解决因为节点指向的改变而在下一轮无法获取的问题。另外,哈希表法也是解决涉及到重复元素的题目的好方法。

2024-07-06 16:55:45 501

原创 算法刷题day03|链表:203.移除链表元素、707.设计链表、206.反转链表

设置一个虚拟头结点来方便操作注:1.初始化链表的构造方法要熟记2.每次对链表进行完插入删除操作时要对链表长度进行更新,否则在调用get函数时会出错3.addAtTail()中,当前节点cur不能dummy->next,因为链表一开始可能为空链表4.addAtIndex()中,cur指向目标元素的前一个节点,此时前插操作可以理解为cur的后插操作,所以在插入链表末尾时也同样适用;当index为链表长度时,cur指向链表最后一个元素,此时cur->next=null5.c++删除节点时要。

2024-07-05 17:14:25 436

原创 算法刷题day02|数组:977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵②

总的来说,数组题目思想上不是很难,难得是对代码的把控。数组下标都是从0开始的。数组内存空间的地址是连续的数组的元素是不能删的,只能覆盖。正是因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。

2024-07-04 15:47:14 461

原创 算法刷题day01|数组:704.二分查找、27.移除元素

1.数组是存放在连续内存空间上的相同类型数据的集合。2.数组下标都是从0开始的,数组内存空间的地址是连续的。3.数组的元素是不能删的,只能覆盖。4.C++中,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。

2024-07-03 15:33:35 320

空空如也

空空如也

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

TA关注的人

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