- 博客(65)
- 收藏
- 关注
原创 代码随想录算法训练营19期第2天| 滑动窗口,螺旋矩阵模拟 (二刷)
【滑动窗口:209 长度最小子数组 904.水果成篮 76.最小覆盖子串1658 最少操作x变0】難點可能在如何判斷和存儲狀態(可能用到複雜的數據結構)76,還可能在把題目轉換成基本款 1658【螺旋矩阵: 59.螺旋矩阵ii 54.螺旋矩阵=剑指29.顺时针打印矩阵 】難點在大於等於,大於,小於等於,小於的選擇。如果不處理特殊情況,就是[start, end] [start+1,end] [end-1,start] [end-1][start-1];如果處理特殊情況就是[start,end-1
2023-07-29 21:34:16
452
原创 代码随想录算法训练营19期第1天| 二分查找,双指针 (二刷)
[二分:704二分查找, 35找插入位置, 34寻找target段头尾, 69x sqrt, 367 perfect square]难点可能在:插入位置,寻找左/右边界,处理超出int大小[双指针:27移除元素, 26.删除排序重复, 283.移动零, 844.比较含退格str, 977.有序数组的平方]难点可能在:写满足[slow++]的条件,巧妙的遍历顺序(两头向中间)
2023-07-29 10:51:22
236
原创 代码随想录额外题目| 哈希 ●205同构字符串 ●1002查找常用字符
先求出第一个word里面各个字母个数。然后后面每个other word求各个字母个数,和第一个取小,所以取到最后答案就是最小的。ary初始化不会写,学了一下:int hashOtherStr[26] = {0};这个全部赋值的写法:memset(hashOtherStr, 0, 26 * sizeof(int));easy题但自己没做出来,一开始审题不认真以为是没有重复的,那个我会做。下面是随想录的思路,看懂了,偷懒了没自己写(这种题也好做实现)我是用的一个map和一个set。然后有重复的就想不明白。
2023-07-26 20:20:06
217
原创 代码随想录额外题目| 链表 ●234回文链表●143重排链表 ●141环形链表
快慢指针相遇判断成环(好重要的方法)快慢指针可以走到LL中间,打断LL反转链表要记牢
2023-07-26 16:20:10
95
原创 代码随想录额外题目| 数组01 ●1365小于当前数字个数 ●941有效的山脉数组 ●1207独一无二的出现次数
注意看constraints做数组哈希
2023-07-22 15:23:06
53
原创 代码随想录算法训练营第59天 | 单调栈 ●503下一个更大元素II ●42 接雨水
第一个自己写出的hard!虽然我的ac code跑出来很慢:先求出和前面几个题一样的,右边第一个比自己大的,左边第一个比自己大的,两个vec。然后进一步处理,变成 right里面装 右边最大的(而不是右边第一个最大的),left里面装 从右往左,左边最大的(而不是第一个最大的)然后left[i]和right[i]取小的那个,做为水的高度,vec[i]就是底的高度。这样跑起来快多了,思路也正常了。自己写的 20min:基础款思路+for(int i=1。我这个思路太搞笑了,太复杂了,单调栈没用到点上。
2023-07-22 08:09:53
50
原创 代码随想录| 图论04 查并集 ●查并集理论知识 ●1971.寻找图中是否存在路径 ●684.冗余连接 ●685.冗余连接II
思路:将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将三个元素连通在一起,如何连通:只需要用一个一维数组来表示,即:father[A] = B,father[B] = C 这样就表述 A 与 B 与 C连通了(有向连通图)。如果几个元素的根是同一个,代表在同一集合。,将非根节点的所有节点直接指向根节点。并查集用处:解决连通性问题。
2023-07-21 20:55:25
506
原创 代码随想录| 图论03●827最大人工岛 ●127单词接龙 ●841钥匙和房间 ●463 岛屿的周长
827最大人工岛 Hard自己没想出来。#127单词接龙 Hard。难难
2023-07-21 20:31:07
135
原创 代码随想录| 图论02●695岛屿最大面积 ●1020飞地的数量 ●130被围绕的区域 ●417太平洋大西洋水流问题
分内陆和外陆,都先从外陆下手,可以使用多种char来标记使用两个visited表是个技巧
2023-07-21 11:33:31
449
原创 代码随想录| 图论01 ●深度优先搜索知识 ●797所有可能的路径 ●广度优先搜索知识 ●200 岛屿数量dfs ●200 岛屿数量bfs
200 岛屿数量:bfs每次放入queue之前就要visited set true
2023-07-20 22:56:39
103
原创 代码随想录算法训练营第58天 | 单调栈 ●739 每日温度 ●496下一个更大元素I
其实就是现在要找i左边第一个小于他的,左边第一个是t,不满足。接下来我们要找的还是要比i小的,那至少也要比t小,既然t的左边第一个小于的已经找到了,那我们就用他的。stack里存的index,遇到更大的就记录,pop原来的,push新的。虽然我的ac code跑出来很慢:先求出和前面几个题一样的,右边第一个比自己大的,左边第一个比自己大的,两个vec。然后进一步处理,变成 right里面装 右边最大的(而不是右边第一个最大的),left里面装 从右往左,左边最大的(而不是第一个最大的)用双指针半天写不出。
2023-07-18 22:47:15
177
原创 代码随想录算法训练营第57天 | 动态规划 part17 ● 647 回文子串 ●516最长回文子序列 ●动归总结
回文题:dp[i+1][j-1] 推导 dp[i][j],遍历顺序左下到右上,最后一个值在 dp[0][size()-1]
2023-07-17 21:39:12
236
原创 代码随想录算法训练营第55天 | 动态规划 part15 ● 392.判断子序列 ● 115.不同的子序列
初始化注意: 在我们dp定义是 dp i j 代表以i-1 j-1结尾的情况下,
2023-07-17 14:59:47
226
原创 代码随想录算法训练营第56天 | 动态规划 part16 ● 583 两个字符串的删除 ●72编辑距离 ●编辑距离总结
583 两str的删除操作(求删除数量)==:dp[i][j]=dp[i-1][j-1]; != dp[i][j]=min(dp[i-1][j],dp[i][j-1])+172 编辑距离(可增删换,求全部操作数量,即距离):增==删==:dp[i][j]=dp[i-1][j-1]; !=: dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1583和72非常非常像,72相当于多了一个替换操作。而且两个都允许编辑和只有一个str允许编辑,是一样的
2023-07-17 11:32:21
296
原创 代码随想录算法训练营第53天 | 动态规划 part14 ● 1143.最长公共子序列 ●1035.不相交的线 ● 53. 最大子序和
1143 公共子序 和718最长公共子数组 对比,subarray是连续的# 1035.不相交的线 和 1143一模一样#53. 最大子序和。求和dp结果不是取最后一个,要弄个res不断取大
2023-07-14 17:25:57
289
原创 代码随想录算法训练营第52天 | 动态规划 part13 ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组
序列dp,含义都是要固定结尾char的
2023-07-14 16:51:04
233
原创 代码随想录算法训练营第51天 | 动态规划 part12 ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结
买股票含冷冻期:要设四个状态买股票含手续费:股票题2+卖时候收费
2023-07-13 22:31:58
224
原创 代码随想录算法训练营第50天 | 动态规划 part11 ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV
dp想清楚有哪些状态,设计清楚这些状态非常重要。比如这题要求只能交易一次或两次。于是设计以下5种状态
2023-07-13 21:02:15
331
原创 代码随想录算法训练营第49天 | 动态规划 part10 ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II
股票题2道:贪心可以做(累计
2023-07-13 16:48:01
378
原创 代码随想录算法训练营第48天 | 动态规划 part09 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
337.打家劫舍III 树形dp不要dp表,直接递归函数返回值
2023-07-13 14:03:11
582
原创 代码随想录算法训练营第46天 | 动态规划 part08 ● 139.单词拆分 ● 关于多重背包 ● 背包问题总结篇
1;本公式是最基础版,是每个物品weight(加入限制)和value(我们要求的值)是分开的动态规划:474.一和零474是普通完全背包,但是背包容量有两个维度,叠加两个一维完全背包成二维即可2;,其实和1 本质是一样的,不过每个物品 value和 weight是一个值动态规划:416.分割等和子集动态规划:1049.最后一块石头的重量 II这俩题都是先数学稍微转换下成普通01背包。能否装满就查dp[ ]最后一个 == target3动态规划:494.目标和动态规划:518. 零钱兑换 II。
2023-07-13 09:36:14
545
原创 代码随想录算法训练营第45天 | 动态规划 part07 ● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数
求使用最少物品数量:● 初始化很重要,毕竟是不断更新取min,所以初始化为INT_MAX。中间判断,如果需要利用的一个还是初始值,还没更新到,就说明这里走不通。● 遍历顺序,因为是最少数量,用排列或者组合遍历一遍都可以。所以遍历顺序,内外层怎么样都可以。
2023-07-12 16:00:32
525
原创 代码随想录算法训练营第44天 | 动态规划 part06 ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ
●完全背包1d: 物品在内外层都可以,背包容量一定从小到大●求装满背包有几种方法,公式都是:dp[j] += dp[j - nums[i]]●求装满背包的方法:求组合是物品在外层,求排列是物品在内层
2023-07-12 11:44:33
450
原创 代码随想录算法训练营第43天 | 动态规划 part05 ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
● 1049. 最后一块石头的重量 II:转化成把石头尽可能分成重量接近sum/2两堆,推导公式就是普通的● 494. 目标和:也是转化 sum1=(sum+target)/2 ,然后是求和为sum1有多少种组合,dp[j]放组合数,dp[0]=1, dp[j]+=dp[j-nums[i]]● 474.一和零: 特殊在重量和背包容量,有两个维度衡量。两个1d套在一起记得都是倒序遍历,总共三个for loop,最外是物品
2023-07-12 08:32:51
418
原创 代码随想录算法训练营第42天 | 动态规划 part04 ● 背包问题二维● 背包问题&滚动数组 一维 ● 416. 分割等和子集
二维01背包:dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])一维01背包:只能物品外层,j=bagweight;j>=weight[i];j-- 416. 分割等和子集:正好装满sum/2, nums[i] 同时是weight和value
2023-07-11 14:14:43
432
原创 代码随想录算法训练营第41天 | 动态规划 part03 ● 343. 整数拆分 ● 96.不同的二叉搜索树
#343 整数拆分:dp[i]=max ( j * max(i-j, dp[i-j]) ,dp[i] );#96不同的二叉搜索树:看到没给node结构就知道不会要遍历tree,而是通过前面的来找规律
2023-07-09 20:49:15
546
原创 代码随想录算法训练营第39天 | 动态规划 part02 ● 62.不同路径 ● 63. 不同路径 II
这个二维初始化要记住,就是一行一行创新的。就是我二维数组坐标总弄错,因为二维数组和数学坐标是反的,是[row][col]!
2023-07-09 11:40:52
573
原创 代码随想录算法训练营第38天 | 动态规划 part01 ●理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
动规五部曲:1 确定dp数组(dp table)以及下标的含义2 确定递推公式 3 dp数组如何初始化 4 确定遍历顺序 5 举例推导dp数组
2023-07-09 11:17:42
483
原创 代码随想录算法训练营第37天 | 贪心算法 part06 ● 738.单调递增的数字 ● 968.监控二叉树
改进:每次找到conflict位置后,不用急于把后面都改成9.反正一轮一轮会不断向前更新conflict位置。等找完了更新完毕,再一起把后面都改成9. 而且仔细看看自己的逻辑会发现,不用处理开头那些特殊情况。倒是 10 会变成09,但是 stoi 也还是能变成9的。于是进行了以上的改进就把 O n ^2 变成了。30min 自己想的是O n^2 也能过。
2023-07-09 09:44:05
559
原创 代码随想录算法训练营第36天 | 贪心算法 part05 ● 435. 无重叠区间 M ● 763.划分字母区间 M ● 56. 合并区间 M
#763划分字母区间 有点难,其他关于数字区间overlap的我基本都会做
2023-07-08 16:10:54
532
原创 代码随想录算法训练营第35天 | 贪心算法 part04 ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。我一开始在have overlap那里更新的不对,只考虑到了错开,没考虑到包含。但一般更新overlap都是,新开头选大的,新结尾选小的(常识啊!#860 柠檬水找零 easy, 常识:找零先找大额的,因为小额的钱更万能。我初看此题看到要不断插入,其实觉得最合适的数据结构是链表,于是又用list写了一下。的时候,一定要先确定一个维度,再确定另一个维度;但是发现并没有快,时间复杂度是一样的。
2023-07-07 22:18:06
577
原创 代码随想录算法训练营第34天 | 贪心算法 part03● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果
如果在考虑局部的时候想两边兼顾,就会顾此失彼 (分发糖果)
2023-07-07 22:02:44
550
原创 代码随想录算法训练营第30天 | 回溯算法part06都是难题● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独 ● 总结
1.把from to这样放到map里,因为map不会按value排列,所以想要同一个from的,按to的顺序排列,就需要把同一个from的to都整合在一起(用set,或map,结合后面的理由,选择用map)。然后我们既然已经这么复杂了,就不要另外弄个叫做used的set那样了,就都放在一起算了。做了我整整1hr,用各种multimap,set,不停地打补丁,放弃了。分析原因是,思路好像出来的很快,能想清,但。都是难题,一刷建议看看思路,跳过那种。这里我其实还稍微有点不理解,但我今天先不想想了。
2023-07-07 21:40:21
536
原创 代码随想录算法训练营第32天 | 贪心算法 part02● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II
终于自己做出来一个M贪心,但思路和随想录不一样,是仿照那个#376摆动序列,画图做的。需要考虑的特殊情况:单调递增的找不到卖出点[1,2,3,4,5],所以要处理一下prices结尾处。我的思路:没有0都行,遇到0(不是最后一个)往前检查有没有可能能跨过0。难,想了20min,发现我想的办法(暴力+从后往前倒着按步骤找) 都是 O n^2 会TLE。for的结束选择在size-2,不用管最后一个(size-1)的值。随想录的思路我真的很难想到,很巧妙:关键-学了随想录的思路自己写了一遍,满巧妙的。
2023-07-07 16:48:19
592
原创 代码随想录算法训练营第31天 | 贪心算法 part01● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和
基本贪心的题目 有两个极端,要不就是特简单,要不就是死活想不出来。没有策略可以判断贪心是否行得通。可以先试一试贪心,不可行就去做dp。两个思路,我这个是小饼干先喂给小胃口。还有一个是大饼干先给大胃口。学完贪心之后再去看动态规划,就会了解贪心和动规的区别。,所以了解贪心算法 就了解它没有规律的本质就够了。“ 贪心其实就是没有什么规律可言。不用花心思去研究其规律,局部最优 -> 整体最优。没有思路就立刻看题解。
2023-07-07 11:36:25
574
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人