自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 hot100第2天|238

238 一开始想到是全部乘起来然后除以nums[i] 但如果有0就不适用 且题目说不能用除法。记录要置零的行和列不要用额外的空间 第一遍遍历矩阵时发现0位置。q3 为什么要先记录第一行是否有0 放在第一次遍历后行不行?看了题解 思路是乘左边所有数和右边所有数 然后相乘即可 (不行 如果第一行本身有0 不重置第一行也不行。q1 第一行和第一列为什么要额外处理?q2 不管第一行 不重置它行不行?

2023-08-09 11:25:13 199

原创 LeetCode 热题 100 第1天|1 49 128 283 11 15 42 3 438

算出从1到n-1指向的最大值 作为右最大 如果一直height[i]不等于右最大 说明这个最大值还在当前遍历数的右边 如果遇到了就再找一次右最大。遍历到的每一格所积累的雨水是 min(左最大,右最大)比当前高度高出的值 (如果不比当前高则为0 不要加负数)因为当前决定高度的是小的 大的动了宽度变小体积只可能变小 这样可以保证比初始化大的都可以遍历到。这里用一个大小为26的vector来记录每次字母出现的次数 减去滑走的字母 加入计数新加的字母。重点是找左边最大和右边最大 遍历的时候头尾不用管因为一定是0。

2023-08-07 17:40:05 243

原创 额外题目第4天|132 673 841 127 684 657

但有一点点误区我之前没搞清楚的就是 不管这里动规数组是什么 它定义的找到的最长递增序列都是以当前下标指向的nums为结尾的 所以在遍历的时候也只考虑当前下标大于前面下标的情况。如果dp[j]+1 == dp[i] 说明找到了另外的一条和现在长度一样的路 但是经过当前 j 指向的元素 count[i]+=count[j]如果dp[j]+1 > dp[i] 说明经过j的话有更长的路 count[i] = count[j]127 也是几天前刚刚做过的图论题 思路是记得的 模版稍微有点模糊 但也做出来了。

2023-08-02 17:32:25 407

原创 额外题目第3天|1382 100 116 52 649 1221 5

容易出现的bug是 在左节点遍历完之后,在vec加入中节点时又去判断左节点的问题 -> 放到vec之后只看右节点 所以要用if else把这两种隔开。回溯时一排一排的放 排数是传递的值 所以遍历所有的列 能放(check函数判断的)就先放着然后准备放下一行 如果放不了就撤回当前。递归公式是当 i 和 j 所指相同时 pal[i][j]=pal[i+1][j-1] 考虑特殊情况 j-i==1。116 用层序遍历 queue来写 count记录每一层的个数 挨个遍历 连next 再放入左右节点。

2023-08-01 20:30:40 228

原创 额外题目第2天|234 143 141 面试题02.07相交链表 205

这里直接使用字符串string,来作为栈,末尾添加和弹出,string都有相应的接口,最后比较的时候,只要比较两个字符串就可以了,比比较栈里的元素方便一些。因为两个链表在末尾相交 算出两个链表的长度之后 为了右侧对齐 长的那条砍掉前面多出来的几个 然后一一比较 直到两个链表的节点相同 即是交点。205 用umap来一一对应s里的字符在t的映射和t的字符在s里的映射 必须要互相都一一对应 所以要有两个umap来写!要先把两个string的有后退格的都删掉 都停留在最后留下来的字符上。

2023-07-28 18:00:32 369

原创 额外题目第1天|1365 941 1207 283 189 724 34 922 35 24

1207 典型哈希表题目 出现的元素范围是-1000到1000 所以定义数组hash数出元素出现的个数 之后遍历整个hash数组 再映射到existed数组 如果hash数组的值>0则记为出现过 如果遍历到出现过的个数就return false。下面comment的是我自己想的用umap来写的 就是把每个次数map到第一个元素出现这么多次数的数上面去 遍历arr数组 通过hash值在map里找这个次数 如果找到就说明前面有过相同次数 return false。这样相等的数值就会被覆盖成最前面的。

2023-07-27 17:08:47 160

原创 图论第2天|417 827 127 841 463 1971 684

841 广搜/深搜所有房间 去过的标记visited 这里直接写的广搜 对于当前每个房间 下一层是当前房间的所有钥匙可去的地方。这里的visited的值就可以是到达该单词的最短路径 用一个unordered_map来写。用dfs来辐射到会流向海洋的陆地 (未被标记过&&与已标记的相邻&&比已标记的高或相等)417 因为边一定会流向大海 分为太平洋和大西洋 写两个visited数组来先标记边。684 main function里面因为要return最后一个可以删除的边 那就。1971 并查集模版题。

2023-07-27 10:37:09 60

原创 图论第1天|dfs 797 bfs 200 695 1020 130

797 dfs经典模版题 跟回溯一样 很好写 x这里是目前达到的节点位置 for loop里面是遍历当前位置可去的节点位置 path要先加入0(所有的路径都是从0开始的)这道岛屿问题用dfs也很好写 不用终于条件 因为调用时是有条件的 main function的逻辑和bfs一样。695 岛屿问题都是一样的 一个岛一个岛的去深搜/广搜且标记计数 找到最大的岛。1020 先遍历四个边的岛屿 都标记之后 再数没标记的1有几个。130 跟上一题一样 把四边的都标记完之后改中间没标记的变成X。

2023-07-26 10:34:53 133

原创 代码随想录算法训练营一刷总结

学到了很多很多 各种题型也都见了一遍 写难题的时候我有稍微放过自己 都看懂示例的code了并且自己写了一遍 但肯定肯定会忘 所以从今天开始就是二刷第一天啦 希望二刷我能高强度一点 不要老是晒网啦 (j人计划如果现在开始每天写4天的随想录 那么还有三周回美国 可以速速二刷完!第一次系统地刷leetcode 经过两个多月终于一刷完结 虽然不是按部就班每天都写 但总算坚持下来了 夸夸自己!但我为啥才153题(挠头。

2023-07-25 14:57:18 246 1

原创 代码随想录算法训练营第60天|84

如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。比栈头小->记下h, left, right, 计算 result。如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。2. 根据暴力解法的思路 第二种用双指针写 要解决的问题是不要每次在找左右第一小的时候都重新遍历 而是。首先来说末尾为什么要加元素0?

2023-07-25 14:36:06 301

原创 代码随想录算法训练营第59天|503 42

才能计算出凹槽面积 这三个height的取值很巧妙 最右边的是正在遍历到的大于stack.top()的height 中间是正要出栈的 最左边是再左边一个。503 我的思路是既然是循环数组 那就最多遍历两圈 其他的跟单调栈写法一模一样。找左边最大和右边最大的时候用动态规划时间复杂度就是O(n)了。双指针法很容易懂啦 其实我觉得更像动态规划。单调栈思路是这个图 cr to。按行来要找每个矩阵块的h和w。

2023-07-21 20:58:09 120

原创 代码随想录算法训练营第58天|739 496

遍历的值只需和top比 如果比他大就pop 一直到把stack里面比新加入的值小的都pop完为止 这样stack里面还是递减数组。(此处用map来找) 根据这个下标来填写下一个更大的值就是最后要的result vector了。但填入result vector的时候不能根据栈里面(nums2的下标)来填 而应该。根据index就可以 2.遍历的值比top小的话就放入stack 这样。739 用stack来写 stack里面发index 不要放数值。496 这道题写了超久 很容易很容易有小bug。

2023-07-21 16:35:13 97

原创 代码随想录算法训练营第57天|647 516

遍历顺序很tricky 因为dp[i][j]是从dp[i+1][j-1]来推导的 画图可知是从左下角 那就是 i 从下往上 j从左往右遍历 且j一定大于等于i。如果 s[j] == s[i], j - i <=2 则一定是回文,否则取决于从 i+1 到 j-1 是否是回文即dp[i][j]=dp[i+1][j-1]递推公式就是当相等时为dp[i+1][j-1]+2 不等时 dp[i+1][j] dp[i][j-1]当中的较大值。初始化即每i==j时dp[i][j]=1 遍历顺序同上。

2023-07-21 11:25:08 85

原创 代码随想录算法训练营第56天|583 72 编辑距离总结

不等时要考虑删除哪一个 如果删除 word1[i-1] 那就是 dp[i-1][j]+1 如果删除 word2[j-1] 就是 dp[i][j-1]+1 如果都删除就是dp[i-1][j-1]+2(这个情况肯定不会比前两个小)dp[i][j]表示的是到i-1和j-1的所需的最少操作数 如果相等即这一步不用操作 直接等于dp[i-1][j-1]当 word1[i-1]与word2[j-1] 相等的时候 dp[i][j]=dp[i-1][j-1]初始化所有dp[i][0]和dp[0][j]为i或j。

2023-07-21 10:42:50 121

原创 代码随想录算法训练营第55天|392 115

用动态规划来写的话 逻辑其实跟1143 1035是一样的 最后返回看dp[s.size()][t.size()]==s.size();t的那边 dp[1][j]一定都是0(j>1时 t的长度大于s的长度)不用特意初始化 跟定义的vector就好 但。除此之外初始化也很巧妙 可以画一个矩阵图 看每一个是从哪里推算出来的 就知道要初始化的边。115 这道题写了超久 好在最后自己debug出来了。要分用不用s[i-1]来匹配 这个思路很巧妙 根据。没想到dp要存的数要用uint64_t来表示。

2023-07-20 17:53:55 42

原创 代码随想录算法训练营第53天|1143 1035 53

1143 dp[i][j]还是表示i-1个text1和j-1个text2为止的最长公共子序列的长度 递推公式感觉有点tricky是max(dp[i-1][j], dp[i][j-1]) 初始化稍微有点麻烦 得初始化所有dp[i][1]和dp[1][j]53 dp[i]表示到i的最长长度(因为是连续所以i必选)递推公式即 在dp[i-1]的基础上加上nums[i]或者直接从i开始(nums[i])但要用一个variable来记录最长长度 因为最长长度不一定是一定包括array末尾的。

2023-07-20 16:01:06 90

原创 代码随想录算法训练营第52天|300 674 718

dp数组记录的是当最第i个值是递增数组的最后一位时最长序列个数 递推公式不能只根据前一个就算出来 要前面的全部遍历一遍 所以复杂度是O(n^2)递推公式很简单 就是nums1[i]==nums2[j]时 dp[i][j]=dp[i-1][j-1]+1。674 因为是连续 所以只要记录到i为止连续最长是多少就好 如果i比i-1的值要小就从1在开始计数。因为要遍历到nums1[i-1]即nums1[nums1.size()-1]结尾的nums2相同最长序列是几。718 dp[i][j]表示以。

2023-07-20 15:05:01 115

原创 代码随想录算法训练营第51天|309 714

0是持有(必须在上个阶段是冷冻的基础上才能买 or 不买 直接是上个阶段的持有)1是不持有(上个阶段持有 现在卖出 or 不卖 直接是上个阶段的卖出现金值)714 简单两状态题 记得每次卖出的时候减手续费就好。2是冷冻期(当前冷冻现金值即为上个阶段的不持有)309 分三个状态来看。

2023-07-20 11:16:25 37

原创 代码随想录算法训练营第50天|123 188

188 跟上一题思路一样 上一题搞懂了这题就不难 至多买卖k次就是有2*k+1个状态 奇数是买入 偶数是卖出 分奇偶来写递推公式就可以了。状态4=max(在i-1的状态3基础上以现在的价格卖掉,不卖 选i-1时第二次卖掉的价格)状态3=max(在i-1的状态2基础上现在买入当前股票,不买当前的 持续i-1的状态3)这里的dp数组 1第一次持有股票 2第一次卖出股票 3第二次持有股票 4第二次卖出股票。状态2=max(在i-1的状态1时现在卖掉,不卖 i-1的第二状态)写股票题记得一定要分状态。

2023-07-20 10:37:12 43

原创 代码随想录算法训练营第49天|121 122

122 dp[i][0]表示现有挣得现金 (不考虑买股票花掉的 所以只递增)dp[i][1]表示现在买入的价格 如果现在的价格低于dp[i-1][1]则更新价格 反之直接卖掉且更新价格为当前价格。121 因为只买卖一次 dp数组记录了在0-i内最小的数 即买入的价格 earned_price每次更新 很易想是max(earned_price, prices[i]-dp[i])

2023-07-20 09:48:08 64

原创 代码随想录算法训练营第48天|198 213 337

如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。213 变成环形其实只是加了一个限制条件 就是头尾不能一起选 那就做两次线形的 一次排除第一个 一次排除最尾个 选两个结果里面大的那个就可以了。如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,(递归返回的是一个vector。动态规划法 cr to。为了防止超出时间限制。

2023-07-19 21:59:02 34

原创 代码随想录算法训练营第46天|139 多重背包

把物品按照其个数放入背包 即抓换成01背包来写。多重背包 cr to。

2023-07-19 20:05:01 18

原创 代码随想录算法训练营第45天|70 322 279

debug的时候主要在递归公式上面 不能直接写dp[j]=min(dp[j], dp[j-coins[i]]+1);不然当dp[j]==-1 or dp[j-coins[i]]==-1是会取其值 是无意义的 dp值为-1时表示无组合满足 此时不用比较min 而应该直接取有组合满足的个数 只有当都>-1时才比较大小。322 这道题是我自己想出来的耶耶!思路写在code里面了 感觉还蛮清晰的!279 物品数组是所有小于等于n的完全平方数 其他逻辑跟上一题差不多。70 用完去背包来写 也是。

2023-07-18 22:30:43 76

原创 代码随想录算法训练营第44天|完全背包 518 377

总结 在一维01背包的基础上 第二层的倒序遍历改正序 且两个for顺序可以调换。coins[i]的个数会在遍历的时候重复加入。518 其实跟之前写过的目标和问题一样。如果是0则全部dp数组的值都是0了。

2023-07-18 21:34:17 80

原创 代码随想录算法训练营第43天|1049 494 474

dp递推公式不难想 dp[i][j] = dp[i-1][j]+dp[i-1][j-nums[i]];(不选第i个 前面有多少种现在照样选+ 选第i个 前面的和加起来为j-nums[i])可以简化 因为dp[half]就是所需求的小的那半最大值 total_sum-2*dp[half]即所求最小剩下的差值。先简单写完过了 还没细细琢磨 目前只跟了一维的套路 初始化是都为0的。这里的x,就是bagSize,也就是我们后面要求的背包容量。假设加法的总和为x,那么减法对应的总和就是sum - x。

2023-07-14 00:26:58 41

原创 代码随想录算法训练营第42天|01背包 滚动数组 416

来看 当dp[j]即价值=bagweight时return true。416 先算出背包大小为total_sum的一半 重点是这道题按照。两个for loop谁先谁后无所谓。01背包 一维滚动数组。

2023-07-12 20:06:08 40

原创 代码随想录算法训练营第41天|343 96

96 思路很巧妙 递推公式最难想 要想到以什么数值为头节点 左边剩几个数右边剩几个数 即dp[几]初始化的时候要考虑到定义的dp数组的size。

2023-07-12 09:23:35 73

原创 代码随想录算法训练营第39天|62 63

63 初始化跟上一题不一样 因为有障碍 在最右边和最下边的障碍前的为0 其他为1。递推公式就是(i,j)到终点为往右走一步位置的数量+往下走一步位置的数量。62 dp数组dp[i][j]表示(i,j)位置到终点的路径数量。dp里面记录的是long long(int过不了)先初始化两条边的点 到终点只有一种方式。遍历顺序为从后往左&&从下往上遍历。

2023-07-10 22:39:57 32

原创 代码随想录算法训练营第38天|509 70 746

dp表示到达第i阶需要最少的cost为dp[i]509 定义dp数组大小的时候记得是n+1。70 跟上题逻辑一样 只是初始化不同。746 最后一个台阶也要上去。

2023-07-09 20:21:45 66

原创 代码随想录算法训练营第37天|738 968

这样数字改变才不影响后续操作 用一个flag记录改动数字的地方 后面都是9就好了还有就是。),0为无覆盖,1表示有摄像头,2表示被覆盖。最后要单独看root。会简单 一开始没想到。

2023-07-09 19:37:42 66

原创 代码随想录算法训练营第36天|435 763 56

又写了一遍代码如下 这种要更新right的值的题目 我第一反应用while写 但它本身就是在一个for loop里面的 可以用哪个if来比较特殊条件就好 比如在这里是i==right。763 巧用哈希表 虽然写出来了但我觉得我这个code写的有点稀碎 修修补补的。即有重叠就改result最后一位的末尾位置,没有重叠就直接加入result。56 我的for loop还是不能一并处理最后一个元素。通过改result里面的元素 逻辑简单清楚很多。435 重叠问题先排序 发现重叠删除末尾位置大的。

2023-07-09 17:54:31 35

原创 代码随想录算法训练营第35天|860 406 452

第一步要想到排序,依起始位置排序就比较终止位置,时刻更新末尾位置以跟下一个气球比较,不挨着的时候就result++那么按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。还有就是要善用vector里的insert函数 我之前也是想着换数组里元素位置想了好久怎么写。分析:先让高个子站前面这样根据k来排的时候就可以数出来比他高的个数 且。860 用两个变量记录5和10的个数 碰到20的先用10块找。看了题解觉得很有道理 cr to。406 题目到手还是没思路 :(

2023-07-09 12:11:35 43

原创 代码随想录算法训练营第34天|1005 134 135

情况二:rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。改进后 先sort数组 注意是按abs来排的 先翻转所有的负数 还剩次数的话翻转末尾(绝对值最小的非负数)情况一:如果gas的总和小于cost总和,那么无论从哪里出发,一定是跑不了一圈的。

2023-07-08 18:11:20 43

原创 代码随想录算法训练营第32天|122 55 45

45 想法从nums[0]所覆盖的范围开始 全扫一遍 找到这里最远可跳跃的作为新的cover 同时也意味着跳到有该范围的点中转 每次计数直到到结尾为止。的代码 觉得比我的更简洁 他是只有一个loop (虽然时间复杂度上是一样的) 然后记录两个最远距离 如果i到达现在最远距离就++如果追踪到最后一个下标就true 发现跟代码随想录思路一样!我自己的解法很蠢 但也记录一下吧 一步步来的 不够贪心 唉。版本二更简洁了 但我觉得版本一反而逻辑更清楚。就是把每一次涨的部分都挣到 很简单。

2023-07-08 02:13:40 102

原创 代码随想录算法训练营第31天|455 376 53

代码随想录的方法也记一下 用int表示diff感觉比我的代码会简洁很多 平坡用diff=0表示,如果遇到平坡或不摆动时不改变prediff的值。count就是一直加 如果加到负数了就舍弃 从下一个新的元素开始重新计 期间每次都判断什么时候count>result就更新result。455 把g[]和s[]递减排序,用最大的饼干先分给胃口最大(且饼干能满足)的小朋友 同时记数 饼干没了或小朋友没了结束。53 用两个variables来记录 result和count。

2023-07-07 01:10:11 30

原创 代码随想录算法训练营第30天|332 51 37

isValid这个function比较巧妙,因为回溯是一排排放的 不用检查同行 也不用检查后面的行 输入row col找同列是否已经有Q 再检查左上角和右上角斜线是否已有Q。note:1. sort里面的compare方程下次要会写 2. tickets[i]={"",""};332 这道题重点在backtracking function是bool而不是void 不需要把所有的路线都找到 会超时。2. val是int 跟board[i][j]比较时要转换为char的形式。37 记录一下我出bug的地方。

2023-07-06 23:43:15 47

原创 代码随想录算法训练营第29天|491 46 47

491 同树层不能重复元素 用一个unordered_map或者int数组来标记 (cr to。数组大小定201是因为题目中说nums里面的元素在[-100, 100] 要善用题目信息。46 排列问题就是同树枝不重复 所以需要标记 不需要start_index。47 我用了两个数组来记录同层和同树枝的元素是否被用过。先排序nums再去重 我觉得差不太多。

2023-07-03 02:00:25 39

原创 代码随想录算法训练营第28天|93 78 90

93 这里我把分字符先放到vector<int>里面了 而没有直接用string 因为我当时觉得判断有四个点不好写 不过看了。78 子集就是每个backtracking的时候都push就好。注意传递start_index的地方要小心出bug。, 她还传递了pointNum我觉得很有效。90 跟组合II逻辑一样 不过是变成子集题。

2023-07-02 17:56:15 38

原创 代码随想录算法训练营第27天|39 40 131

需要注意的是以start_index为开头找所有substr的这个for loop 我的i是str的末尾(也是下一个递归的开头) 用左闭右开写的 len就是i-start_index。39 因为元素可以重复利用 想象树往深处走可以用同一元素 但不能用当前元素前面的元素 所以 start_index传递的是当前元素。只要它在数组中重复出现 所以递归的时候不用去重 传递的start_index为i+1。注意while去重 在重复元素第一次出现操作完之后再去重 跳过后面重复元素的操作即可。

2023-07-02 17:03:07 36

原创 代码随想录算法训练营第25天|216 17

17 我先自己做的 感觉还是按回溯模版来 画树的话就是每一层是每一个digit对应的几种可能的字母,树的深度就是digits的个数。2-5对应的数字还是顺序三个字母对应一个数字的 但7 8 9 就没办法用公式表达会写的比较累赘。剪枝3 保证9-i+1>=k 跟77题组合题一样 即i<=10-k。剪枝1 入backtracking前判断k的数量是否过大。剪枝2 n<start_index 此时不用再向下找了。用一个string来表示每个数字有的字母 很高效。

2023-07-01 00:42:40 35

空空如也

空空如也

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

TA关注的人

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