自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营四十八天|739.每日温度、496.下一个更大元素 I、503.下一个更大元素II

【代码】代码随想录算法训练营四十八天|739.每日温度、496.下一个更大元素 I、503.下一个更大元素II。

2024-09-02 21:39:22 222

原创 代码随想录算法训练营四十六天|647.回文子串、516.最长回文子序列

【代码】代码随想录算法训练营四十六天|647.回文子串、516.最长回文子序列。

2024-08-31 22:14:47 252

原创 代码随想录算法训练营四十五天|115.不同的子序列、583.两个字符串的删除操作、72.编辑距离

思路:思路跟之前求公共子序列差不多 分为dp[i-1] == dp[j-1] 的情况 和dp[i-1]!= dp[j-1]的情况 不等于的情况下分为三种 1.修改一个字符 2.删除一个字符 3.添加一个字符 并取其中的最小值。思路:算出公共子序列的最大长度,那么用两个字符串的长度减去公共的部分,就得到了需要操作的最少步数。

2024-08-30 23:01:58 290

原创 代码随想录算法训练营四十三天|1143.最长公共子序列、1035.不相交的线、53.最大子序和、392.判断子序列

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;即:dp[i-1][j] 与 dp[i][j-1]思路:跟上题思路一样,都是不相邻找最长共同。

2024-08-29 21:17:52 259

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

思路:需要注意下标, 二维dp因为i-1 j-1 的原因所以行和列都会多一行。而nums1 nums2 都是0 到len(nums) -1。思路:如果nums[i] > nums[j] 那么dp[i] 要么是dp[i] 要么是dp[j] + 1。

2024-08-29 20:37:26 211

原创 代码随想录算法训练营四十一天|188.买卖股票的最佳时机IV、714.买卖股票的最佳时机含手续费

思路:122 题目的基础上 交易的时候减去一笔手续费即可。思路:跟两次那题思路类似,将两天扩大到了n天。

2024-08-28 00:10:30 197

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

思路:与 122 不同之处在于股票可以购买多次,买股票的时候需要加上之前的利润。dp[i][1] 表示第i天卖出股票所得的最多现金。思路:dp[i][0] 表示第i天持有股票所得的最多现金。

2024-08-26 22:48:20 178

原创 代码随想录算法训练营第三十九天|198.打家劫舍、

思路:由于数组的尾巴和首部相连,所以尾部和首部不能同时采用。所以要拆分成两个dp来做,一个是除去首元素,另一个是除去尾元素。思路:因为隔一家才能取,所以当前最大的价值要么是dp[i-2] + nums[i] 或者是 dp[i-1]

2024-08-24 23:07:49 275

原创 代码随想录算法训练营第三十八天|322.零钱兑换、279.完全平方数、

思路:因为单词的组成有顺序且单词可以重复使用,所以是完全背包问题,且要先遍历背包容量。思路:1.注意初始化,dp[1-n]初始化为float('inf')思路:跟零钱兑换思路一样。这里注意对字符串的处理。

2024-08-23 21:52:44 216

原创 代码随想录算法训练营第三十七天| 52.携带研究材料、518.零钱兑换||、377.组合总和、

先遍历物品,再遍历背包,只会得到一种情况 例如{1, 5} 而不会出现 {5 ,1};而先遍历背包,再遍历物品,则会出现(1,5) 和 (5,1)coins[0] 加入遍历 0:1, (从这里开始)1:0 + dp[1 - coins[0]], 2:0 + dp[1-coins[0]] ....coins[1] 加入遍历 0:1, 1:1, (从这里开始)2:1 + dp[2-coins[0]] (1 +1的情况和2的情况)所以递推方程为dp[j] = dp[j] + dp[j - coins[i]]

2024-08-22 21:40:49 164

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

思路:要想两堆石头最终想减最小,其实就是要将两堆石头尽可能分得近,即最理想情况target = sum(stones) // 2;每个石头只能用一次,而且要想尽可能大地将石头放入,所以可以考虑用01背包。

2024-08-21 21:56:55 250

原创 代码随想录算法训练营第三十五天| 46. 携带研究材料、63.不同路径||

【代码】代码随想录算法训练营第三十五天| 46. 携带研究材料、63.不同路径||

2024-08-20 21:10:53 157

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

思路:当前dp[i][j]来自dp[i-1][j] 和 dp[i][j-1]思路:针对上一题做一些障碍物的判断就行。

2024-08-19 21:14:12 342

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

思路:这题主要是要想清楚楼顶在哪,要多加一位。

2024-08-17 11:11:36 233

原创 代码随想录算法训练营第二十九天| 56. 合并区间、738.单调递增的数字

思路:一开始用暴力思路出错了,后来看了解析。从后向前,如果str_num[i] > str_num[i+1] 则将str_num[i]-1 str_num[i] 后面的全部归为9。思路:跟昨天几题的思路一致,先按照前序进行排序,然后逐个合并区间;这里我做的判断是如果是重复区间则进行合并,如果不是则将上一个合并完的区间加入结果集。

2024-08-16 17:56:53 161

原创 代码随想录算法训练营第二十八天| 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

思路:先对区间进行排序 得到[1, 6],[2, 8],[7, 12],[10, 16];当points的from 大于前一个points的to,意思是这两个气球可以用一支箭来戳破,就将当前的points的to更新为前一个的to,否则则需要更新一个箭支。思路:跟上一题思路类似,但这一题要求找出不重叠的合并重叠的,最后总个数减去不重叠的区间的个数就是要删去的区间。思路:这道题看的解析思路。

2024-08-16 01:35:11 221

原创 代码随想录算法训练营第二十七天| 134.加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列

思路:首先如果gas的总和小于cost的总和,那么无论如何都跑不到一圈。接下来就算每天的rest[i] = gas[i] - cost[i]。如果当天的rest累加为负值时,那么就不可能从当前位置出发跑一圈。思路:想到了两次贪心的思路,但是从后向前的result[i]的设置没有考虑周全,因为有两种选择。一:如果本身result[i-1] 的值就比result[i]大的话就选result[i-1],如果两个相等就选result[i]+1。思路:对身高进行排序,然后根据后序的值将元组插入新数组。

2024-08-14 23:02:51 235

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

其实如果第0天买入,第三天卖出,那么price[3] - price[0] = (price[3] - price[2]) + (price[2] - price[1]) + (price[1] - price[0])。思路:主要在于一直想不清楚什么时候累加步数,其实就是统计每一步所能到达的最大范围,例如[7,0,9,6,9,6,1,7,9,0,1,2,9,0,3] 第一步能走到7,那么如果7没走到终点时,下一次就要加一步,也就是遍历到下标为7的节点时,看看0 9 7 9 7 1中是否有节点能走到终点。

2024-08-13 20:45:36 293

原创 代码随想录算法训练营第二十五天| 455.分发饼干、376. 摆动序列、53. 最大子序和

思路:我的思路是把两个数组进行排序,然后用两个指针分别指向各自的第一个并向后遍历,比较大小,如果饼干能满足胃口,同时向后移动;不能满足,仅移动饼干。

2024-08-13 01:35:22 173

原创 代码随想录算法训练营第二十四天| 491.非递减子序列、46.全排列、47.全排列 ||

思路:主要是去重思路上的不同。1.先排序,再用used数组进行判断;2.不能进行排序,用set数组进行判断,如果数字在set中,则在同一层上存在重复。

2024-08-11 00:12:50 212

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

思路:跟分割字符串的题目模板一样,区别在于判断每一个数是否为0 到 255 的数,以及有没有出现前导0的情况。思路:思路跟之前的去重思路一样;

2024-08-09 23:43:20 183

原创 代码随想录算法训练营第二十二天| 39. 组合总和、40.组合总和II、17.电话号码的字母组合

思路:主要是要在树的宽度上去重,而树的高度上不用去重,需要用一个used数组来进行判断。思路:每次回溯的时候同样的数字能被取到,所以更改一下startIndex即可。

2024-08-08 23:29:14 153

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

1,2,3,4 可以看成是树的宽度,而树的深度就是k,因为要分成k个一组。而在递归的过程中,我们需要一个startIndex来帮助我们找到此时到了树的那一列宽度上,例如startIndex = 1时,也就是找到了[1,2]、[1,3]、[1,4]的前置1。思路:建立数字到字符集合的map映射,然后将数字字符逐个提出,转换成下标,并在map映射中找到对应的集合,然后现在第一个集合中遍历,并递归第二个/第三个集合。

2024-08-07 23:55:40 234

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

思路:本体需要删除多个节点,如果节点不符合区间要求 (1)若当前节点小于low,则去当前节点的右节点寻找一个符合的节点返回给当前节点的父节点;(2)若当前节点大于high,则去当前节点的左节点寻找一个复合的节点返回给当前节点的父节点。思路:总体思路跟中序后序构建二叉树思路一样,就是查找root的方式不同。root.right = 找到节点并用right接收。root.left = 找到节点并用left接收。思路:观察累加值,发现遍历顺序是右中左。去right寻找节点。

2024-08-06 21:41:06 162

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

思路:很简单,val比当前节点大,往右找,val比当前节点小,往左找;直到找到None,并记录pre,再插入。第一次用迭代没做出来,思路是正确的,但是处理不好;看了代码随想录写出的答案。

2024-08-05 21:47:40 250

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

其次,如何确认此时找到了公共祖先,那么就要求左节点返回p节点/q节点, 右节点返回p节点/q节点,那么此时root.left!= None ,此时有两种情况,要么是right已经找到了root,那么返回root即可;思路:要找到公共祖先,首先要想到自底向上搜索,那么可以想到后序遍历,左右中,先遍历子节点。思路:类似的思路,保存前一个节点,然后按照中序遍历就能得到递增序列,然后判断数和数之前是否插值最小。最后确认递归结束点,当遍历到p 或者 q 直接返回就可,当遍历到None 返回None。

2024-08-04 00:02:32 277

原创 代码随想录算法训练营第十六天| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

思路:以一个树为基础,另一个树在此基础上进行相加,其实就是树遍历的思路。思路:中序遍历若是递增则是二叉搜索树。思路:跟中序后序构建二叉树思路类似。思路:二叉搜索树的正常思路。

2024-08-02 20:46:42 215

原创 代码随想录算法训练营第十六天| 513.找树左下角的值、112.路径总和、113.路径总和II、106.从中序与后序遍历序列构造二叉树

递归的方式其实就是找一个最大的深度,当深度大于当前深度时,记录此时节点的val值,最后返回。思路:每次现在后序节点里找到根,然后用根的值在中序遍历中划分左右子树,再继续遍历。思路:层序遍历的方法很容易想到,遍历到每一层时,选择第一个遍历到的节点即可;思路:同样是到叶子节点的时候,进行判断,然后在遍历节点的时候进行回溯。

2024-08-02 00:23:56 202

原创 代码随想录算法训练营第十五天| 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

思路:其实跟求二叉树最大深度的题目思路一样,都是从左右根出发,判断每一个小树是否符合平衡树条件,逐渐到根节点。抓住这个思路就可以直到我们需要直到左右子树的高度,所以递归返回的应该是int类型,但是我们同时也要判断leftHeight 和 rightHeight不满足的情况下应当返回的值,所以我们用-1来表示不满足情况。思路:本质上是回溯的思想,要考虑清楚什么时候终止递归,题目要求的是到叶子节点的路径,所以当判断是叶子节点时,就可以添加结果了。

2024-07-31 15:02:56 128

原创 代码随想录算法训练营第十四天| 226.翻转二叉树、101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

思路:同样是层序遍历 不同的是,遍历到叶子节点时就可以跳出循环了,因为叶子节点就是最小深度;递归法基本思路与最大深度相同,需要注意的是最小深度是根节点到叶子节点的距离,所以要考虑根节点如果左子树是空的情况。递归法--> 根节点的高度是指根节点到叶子节点的最长简单路径的条数或节点数,所以可以用后序遍历来求解。思路:通过先序遍历根左右,每次遍历到root 都转换root.left 和 root.right,然后再继续遍历下一个root。思路:以中心为轴两边镜面对称,判断是否镜面对称,本质就是树的遍历。

2024-07-30 23:55:16 386

原创 代码随想录算法训练营第十三天| 递归遍历、迭代遍历、统一迭代、层序遍历

【代码】代码随想录算法训练营第十三天| 递归遍历、迭代遍历、统一迭代、层序遍历。

2024-07-29 12:59:05 250

原创 代码随想录算法训练营第十一天| 150.逆波兰表达式求值、239.滑动窗口最大值、347.前k个高频元素

(3).1 单调队列append(5) 因为5 > -3 所以-3 pop();(3)滑动窗口到 -1 -3 5 (队头元素为3 == 3{将要从滑动窗口移出的数},所以队列要将队头元素移出)【-1,-3】(2).1 单调队列append(-3) 此时-3 < -1 不用pop() 【3,-1,-3】(1).3 单调队列append(-1) 此时-1 < 3 不用pop() 【3,-1】(1).2 单调队列append(3) 但此时3 > 1 因此将1 pop() 【3】

2024-07-27 19:17:17 374

原创 代码随想录算法训练营第十天| 232. 用栈实现队列 、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项

思路:用一个堆栈当作入堆栈,另一个堆栈作为出堆栈。当push时,将元素压入入队栈,当pop时,分两种情况。第一种情况:如果出堆栈没有元素,则将所有的入队栈元素压入出堆栈,然后将最后一个元素出栈;思路:思路就是,当pop元素时,需要pop的是最后一个元素,队列的操作只有出头元素,所以只要保留最后一个元素,将最后一个前面的元素全部添加到末尾即可,最后将第一个元素pop即可。思路:思路很简单,当碰到右括号时,判断堆栈顶上的字符是不是匹配的字符,或者堆栈还有没有字符,以及循环结束后,堆栈中还有没有剩余字符。

2024-07-27 00:09:19 178

原创 代码随想录算法训练营第九天| 151. 反转字符串中的单词 、55、右旋字符串

思路:要运用x.strip()去除首位空位。思路:将字符串分成两部分,再逆顺序相加。

2024-07-26 00:22:38 239

原创 代码随想录算法训练营第八天| 344. 反转字符串 、541.反转字符串Ⅱ、 54.替换数字

思路:碰到“0” 到 “9” 转换成 “number”即可。思路:思路差不多,将上一题封装成一个函数。思路:头跟尾交换 然后逐渐向中间靠拢。

2024-07-24 23:22:20 229

原创 代码随想录算法训练营第七天| 454. 四数相加II 、383.赎金信、 18.三数之和、15. 三数之和

思路:利用双指针思路来获取每一个三数之和,left的下标范围是0,1,2,。n - 3 (因为后面还有n - 1 和 n - 2两个数)每一轮循环中,middle的下标从i + 1开始,right的下标从n - 1开始,如果nums[left] + nums[middle] + nums[right] == 0 则表示找到了对应的三数之和。1.left的去重,当nums[i] == nums[i-1]则当前以left为首的三数之和已经出现过了,不用再次计算。思路:跟三数之和思路一样,多一层循环即可。

2024-07-23 20:41:13 312

原创 代码随想录算法训练营第五天| 242. 有效的字母异位词 、 349.两个数组的交集、202. 快乐数、 1. 两数之和

思路:用一个hashmap记录,例如当前target为9,当遍历到2时,将target-2记录到dict中,当遍历下一个元素时,检查是否自身在dict中存在,若存在,则代表有一个数跟当前遍历的数相加能够得到target,记录时记录当前数的下标即可。思路:没什么额外的思路,注意defaultdict的用法,它的主要特点是可以为不存在的键提供默认值,从而避免了在访问不存在的键时引发。思路:只要找出有相同数就可以了,不用记录数字,那么当hashmap里的value值为0的时候,就代表该key值为重复出现的数字。

2024-07-22 21:13:17 192

原创 代码随想录算法训练营第四天| 24. 两两交换链表中的节点 、 19.删除链表的倒数第N个节点、02.07. 链表相交、142.环形链表II

交换节点需要进行三部,这里将需要交换的两个节点记为a->b,记a之前的节点为current,b之后的节点为after 即:current->a->b。思路:先选出长链表,长链表和短链表长度的差值定为n,先让fast指针在长链表上移动n步,然后fast和slow指针同时移动,如果碰到交点就返回,如果到底没有就返回None。思路:快慢指针,先让快指针移动n次,然后快慢指针一起移动,当fast.next == None 时,slow就到了删除节点的前一个节点,然后就可以进行删除。step2:b的next指向a。

2024-07-20 23:59:06 257

原创 代码随想录算法训练营第三天| 203. 移除链表元素、 206. 反转链表、707. 设计链表

思路:题目是要删除链表中的与val相等的节点,所以从头到尾遍历,当遇到符合条件的节点,就可以进行删除,但若第一个节点就是要删除的节点会有额外的操作,因此为了保证每一轮循环都有相同的操作,不增加额外的判断,所以增加一个虚拟的头节点,来避免额外的操作。这里要注意python定义新节点的方式。思路:头插法插入时链表的顺序是相反的,所以可以新建一个虚拟节点,将原来的链表头插进新节点。思路:模拟题目,需要注意的是节点定义没有给出,需要自己写。

2024-07-19 19:30:12 149

原创 代码随想录算法训练营第二天| 977. 有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

思路:没什么好说的,滑动窗口的思想,需要注意的一点就是当需要移动左指针的时候,不能只移动一次,因为移动一次之后剩下的数相加仍然可能符合结论,所以要用循环移动。思路:自己一开始的做题思路很简单,遍历一遍数组,排个序,再返回结果,这里要注意的一点就是总的时间复杂度是O(nlogn),因为排序算法的时间复杂度是这个。看了代码随想录的解析之后才知道优化解,其实一开始给我们的就是一个有序的数组,无非是比较头和尾之间的数的绝对值,每次选出头和尾中最大的一个填入对应的结果即可。

2024-07-18 23:28:27 147

空空如也

空空如也

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

TA关注的人

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