- 博客(55)
- 收藏
- 关注
原创 2刷第二天(LeetCode977. 有序数组的平方、LeetCode209. 长度最小的子数组、LeetCode59. 螺旋矩阵 II)
①有序数组和长度最小的子数组,依旧是用了双指针的解法,明确双指针指向哪即可。②螺旋矩阵看起来比较复杂,其实就是二维矩阵的由外圈到内圈的赋值过程,清楚各个量应该怎么变化就很简单。
2023-03-08 11:35:33 476 2
原创 二刷第一天(二分查找,移除元素)+数组新题三道:LeetCode26. 删除有序数组中的重复项、LeetCode283. 移动零、LeetCode844. 比较含退格的字符串
①复习了两道旧题,对于二分法和移除元素有了更深的理解---分别为对应区间问题和双指针问题。②剩下的三道题都是双指针问题,最后形成的思路就是遇到移除数组中元素问题,可以考虑双指针的思想。
2023-03-07 08:59:19 242
原创 一刷总结+未来求助
让我回顾一下都学到了什么,我知道学了数组,链表,栈,队列,堆(优先级队列实现的),二叉树(我觉得最难,学了递归和层序,感觉一入递归深似海),回溯(模板),贪心(奇思妙想的奥数题),dp(背包问题最难,其他的都还好),最后单调栈(这个时候我已经有点想休息了,没好好刷)。总体的说我能知道学了什么,但是具体的我已经想不起来了,而且出现了有的题我做过,但是又不会做了,看几眼博客又想起来了,其实这就是因为不是我自己独立做出来的题,所以记忆不深,依旧需要二刷更深刻的理解原理。8.可能要学数据库技术,也不知道该学什么。
2023-03-03 01:39:27 250
原创 第52天|LeetCode84. 柱状图中最大的矩形
每个柱子能形成的矩形面积 = (右边第一个比当前柱子高度矮的位置 - 左边第一个比当前柱子高度矮的位置) * 当前柱子高度。
2023-02-28 04:29:08 176
原创 第51天|LeetCode503.下一个更大元素 II、LeetCode42. 接雨水
①环形的单调栈问题想到取模。②求雨水问题,双指针解法:min(左边最大,右边最大)- 当前高度。要注意遍历顺序。单调栈写法二刷再来。
2023-02-28 04:10:20 92
原创 第50天|LeetCode739. 每日温度、LeetCode496. 下一个更大元素 I
①遇到求右边第一个大的或者小的元素的位置类似的问题用单调栈。②遇到多个数组下标和值的关系的时候要想到映射。
2023-02-27 09:56:45 159
原创 第49天|LeetCode647. 回文子串、LeetCode516. 最长回文子序列
①第一题求的是回文子串,是连续的。②第二题求的是回文子序列,是不连续的。③两题相同的就是都用到了判断回文串的方法,即从两端着手判断。
2023-02-24 07:08:09 110
原创 第48天|LeetCode583. 两个字符串的删除操作、LeetCode72. 编辑距离
①两个字符串的删除操作 ---考虑相等和不相等的两个情况,相等=前面的,不相等就要删除---三种删除方式(删word1,删word2,都删)然后取最小。②编辑距离 --- 比两个字符串的删除操作多了替换和插入操作,但是插入操作和删除操作是一样的;替换---不相等了需要一步操作即dp[i-1][j-1] + 1。
2023-02-23 06:54:16 277
原创 第47天|LeetCode392. 判断子序列、LeetCode115. 不同的子序列
①判断是否是子序列---相当于求两个序列的最长公共子序列的长度是否是小的序列的长度。递推公式:如果相等,那么.如果不相等dp[i][j-1]即删除长的序列中的不等的元素。②判断一个序列中可以出现多少个另一个序列---有多少种删除方式,使一个序列变成另一个序列。相等的话考虑相等的元素,那么之前有多少个现在就有多少个即dp[i-1][j-1];不考虑相等的元素,即可能bagg,bag即dp[i-1][j].故d。如果不相等的话,就要删掉长的字符串中不相等的元素,即跳过那个元素dp[i-1][j]。
2023-02-23 05:20:12 117
原创 第46天|LeetCode1143. 最长公共子序列、LeetCode1035. 不相交的线、LeetCode53. 最大子数组和
①最长公共子序列 --- 不连续,二维,用i-1,j-1方便初始化;初始化首位为0 --- 非法,其余位置 --- 0 因为,长度不能为负数且不知道是否是公共的;dp[i][j]分两种情况求,相等还是根据前面的值求,不等的情况下 --- nums1向前移一位/nums2向前移一位。②画线 --- 就是求最长公共子序列③最大连续和 --- dp根据前面的值或者把前面的舍弃从新开始。
2023-02-21 04:43:59 112
原创 第45天|300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
①递增子序列 --- 不连续,一维,根据0~i-1的最大值求dp[i];初始化都为1,因为长度最小为1.②连续递增子序列 --- 连续,一维,根据前一个的值求dp[i];初始化都为1,因为长度最小为1.③最长公共子数组 --- 连续,二维,定义dp的时候用i-1,j-1表示方便初始化数组;初始化都为0(一个是非法,一个是不等于的时候那个位置的值就是0/理解成刚开始的时候不知道有没有重复的子数组,所以就是0) .
2023-02-21 04:07:37 80
原创 第44天|309.最佳买卖股票时机含冷冻期、714. 买卖股票的最佳时机含手续费
①冷冻期题目将其分成4个状态来推导递推公式,在初始化的时候如果不合法那就代入递推公式中去求不合法的初始化值。②手续费题目---在买入或者卖出的时候加手续费都可以。
2023-02-20 01:54:48 96
原创 第43天| 123.买卖股票的最佳时机III、 188.买卖股票的最佳时机IV
①第一题是股票可以买卖2次,可以列出5个状态分别是什么,当然也可以初始化具体5个状态。递推公式都是根据前一个的状态来求的。最后返回的是最后一天的最后一次不持有的状态。②第二题就是将2抽象成了k,所以在求递推公式的时候,我们要每一次求出买和卖两个状态,然后用循环来做,每次跳两步即可。在初始化的时候同理要用循环来初始化,然后只有买入的状态初始化为-prices[0],其余的都为0.③现在做了股票买卖系列的:只能买卖一次,可以买卖多次,至多买卖两次,至多买卖k次。
2023-02-18 01:04:34 531
原创 第42天|LeetCode121. 买卖股票的最佳时机、LeetCode122. 买卖股票的最佳时机 II
①两道股票问题,一个是只能买卖一次,一个是能买卖多次。②用动态规划来解决总体思路差不多故dp含义一样,当前是否持有股票的最大利润都根据前面的值求,故初始化和遍历顺序一样的。③但是递推公式不同,如果可以买卖多次的话再买的时候要加上前面已经买卖过的利润。④用贪心也可以解决且效率更高,但是贪心只能解决特定的股票问题,而dp可以解决股票系列问题。
2023-02-16 06:39:01 195
原创 第41天|LeetCode198. 打家劫舍、LeetCode213. 打家劫舍II、LeetCode337. 打家劫舍III
①三题都是抢劫问题,都是相邻的不能抢,不同的就是地方的布局不同,一个是线性的,一个是环型的,一个是树型的。②对于线性和环形问题:当前获得的钱数根据相邻的前两个来确定递推公式。而环形问题可以拆成线性问题来解决。对于树形问题:当前获得的最大钱数根据左右孩子的状态来获得。
2023-02-16 06:03:03 198
原创 第40天|LeetCode139. 单词拆分、多重背包
③这样就变成了01背包 --- 递推公式:即dp[j] = max(dp[j] , dp[j-weight[i]] + value[i]);2)while(nums.get(i) > 1){// 即有多的weight里加一个,value里加一个,重新设置nums链表第i个位置的值。给定一个容量为bagSize的背包,给定一堆物品,第i个物品对应重量为weight[i],价值为value[i],物品个数为nums[i],求装满背包的最大价值为多少?假设一段上要求dp[j],那么在j之前有个位置i,
2023-02-14 07:49:03 244
原创 第39天| 70. 爬楼梯 (进阶)、LeetCode322. 零钱兑换、LeetCode279.完全平方数
①三题都是物品可以重复使用,所以都是完全背包问题,背包都要正序遍历。②爬楼梯进阶 --- 求的是方法数目,即排列数,因为不同的数字排列是不同的方法。所以要先遍历背包再遍历物品。③零钱兑换 --- 求的是最少个数,所以无论求的是排列数还是组合数个数都是相同的,所以先遍历背包还是先遍历物品都可以。递推公式:dp[j] = min(dp[j], dp[j-coins[i]] + 1)④完全平方和 --- 求的是最少个数,所以哪个先遍历都可以。
2023-02-14 06:44:12 248
原创 第38天|完全背包理论、LeetCode518. 零钱兑换 II、LeetCode377. 组合总和 Ⅳ
①完全背包和01背包的区别在于在遍历背包的时候要正序遍历。和二维的01背包一样,先遍历背包或者先遍历物品都可以纯的完全背包②零钱兑换:求的方法数目,故递推公式:dp[j] += dp[j-coins[i]]。求的是组合数,所以要先遍历物品再遍历背包。③组合总和:求的是方法数目,故递推公式:dp[j] += dp[j-nums[i]]。求的是排列数,所以要先遍历背包再遍历物品。
2023-02-13 01:59:02 105
原创 第37天|LeetCode1049. 最后一块石头的重量 II、LeetCode494. 目标和、LeetCode474. 一和零
①最后石头重量 ---给定一个容量(sum/2)的背包,尽可能的向背包里放。总统思路就是分成尽可能相近的两堆石头,然后相撞。递推公式 dp[j] = max(dp[j], dp[j-nums[i]] + nums[i])。不放价值不变,放了价值变。②目标和 ---给定一个容量的背包((sum+target)/2),求将其放满有多少种方法。总统思路将集合分为正数集和负数集,然后数学推导得到背包容量 = (sum+target)/2。
2023-02-11 07:01:55 94
原创 第36天|01背包二维dp,01背包1维dp顿号、LeetCode416. 分割等和子集
1. 01背包问题:①二维:1)明确dp[i][j]含义;2)递推公式 = max(加物品i,不加物品i3)遍历顺序:正序,先遍历书包还是物品无所谓;在遍历的时候,如果j < weight[i]否则的话:递推公式dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]] + value[i])。4)初始化:根据左上方和上方得到当前值,故初始化最上面和最左边。而最上面的初始化如果j < weight[i],置0;否则置value[0]--- 因为每个元素只能用一次。
2023-02-09 08:48:13 104
原创 第35天|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树
拆分整数:①整数拆分要想到dp的含义,拆分的时候要想到有两类,即拆成两个和多个要比较,同时因为j不断变化,所以要将dp[i]也加入比较。②在拆的时候要固定一个去拆另一个,因为都拆的话会和上面重复。③因为要求最大值,所以拆成最相似的数有可能是最大的,所以j就遍历到i/2即可。④初始化的时候,因为根据前面的值,所以初始化前面的,但是dp[0],dp[1]没有意义所以初始化dp[2],然后从i=3开始。不同二叉搜索树:①要想到种数= 头1+头2+...+n。②头 = 左子树个数*右子树个数。
2023-02-09 00:47:32 57
原创 第34天|LeetCode62. 不同路径、LeetCode63. 不同路径 II
路径问题---dp数组是二维的,同样贯彻5步曲,要注意的就是在第二题中修改递归公式和初始化。同时要注意头尾特殊情况。
2023-02-07 05:41:22 280
原创 第33天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
①动态规划入门,有5步曲,按5步分析可以贯彻整个dp篇。②斐波那契数题目中要注意的就是,容易造成索引越界,所以在初始的时候要判断特殊的情况,防止越界。③爬楼梯本质上就是斐波那契,也要注意越界问题,第三题中cost的长度保证了不会越界。
2023-02-07 05:07:39 96
原创 第32天|LeetCode738. 单调递增的数字、LeetCode714. 买卖股票的最佳时机含手续费、LeetCode968.监控二叉树、贪心总结
①单调递增数字举例子就好分析了,要注意赋9从哪开始赋---技巧。②贪心结束了,做了六类的问题:1)简单问题:柠檬水,发饼干,k次取反数组和。2)中等问题:摆动序列,单调递增。3)多维问题:分发糖果-左右遍历,身高问题。4)区间问题:区间覆盖问题(跳跃游戏),重叠区间问题(气球,无重叠区间,合并区间,划分字母区间)5)num+i问题:即一个是若num
2023-02-05 23:38:32 120
原创 第31天|LeetCode435. 无重叠区间、LeetCode763. 划分字母区间、LeetCode56. 合并区间
①第一题要注意按左边界还是右边界排序才能得到局部最优解---非重叠区间数目最多,在更新最大右边界的时候和气球问题一样,如果重叠了,要更新为两个区间右边界的最小值---这样就能保证当前区间和之前的所有区间都重合---即重叠区间数目最小(可以这样想,因为重叠的条件苛刻,所以重叠的数目最小②第二题---最多段数,局部最优---遍历s的时候,当遍历的位置==当前遍历元素以及之前元素的最远位置时进行划分求值。如何求s中出现的字符的最远位置是个重点。因为要求的是个数,我们得到的都是位置坐标,所以要用一个last。
2023-02-04 03:02:47 58
原创 第30天|LeetCode860. 柠檬水找零、LeetCode406. 根据身高重建队列、LeetCode452. 用最少数量的箭引爆气球
在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆。4.如果遇到20块,如果有10块即if(ten>0){ten--,five++}else{five -= 3}// 这里涉及到了贪心,即先找10块的,再找5块的,因为10块的只能找给20,而5块即能找给10,也能找给20,即5是万能的。(即完全重叠部分的右边界),当下一个气球的头小于这个右边界的时候,下一个气球就能和前面一起射爆。
2023-02-03 02:35:12 64
原创 第29天|LeetCode1005. K 次取反后最大化的数组和、LeetCode134. 加油站、LeetCode135. 分发糖果
先将最小的负数取反;然后在正数中对最小的正数进行剩余的k次操作。②第二题 --- 局部最优解---curSum
2023-02-02 02:15:04 143
原创 第28天|LeetCode122. 买卖股票的最佳时机 II、LeetCode55. 跳跃游戏、LeetCode45. 跳跃游戏 II
①第一题:全局变量求最大利润,首先将每天的利润表示出来,然后只求正的利润---就是局部最优解。②第二题:跳跃问题,用覆盖的思想来思考,在覆盖范围内遍历,然后更新覆盖范围,看其是否能覆盖到数组末尾。③第三题:跳跃问题求最小次数---全局变量,局部变量---每次尽量向前跳。同样用覆盖的思想来解决。在整个数组范围内遍历,更新next的覆盖范围。同时要判断,当遍历到当前覆盖范围的时候,覆盖范围和整个数组长度的关系,如果不够就要开启下一次覆盖---即更新跳跃步数,更新cur,然后再判断cur和数组长度关系。
2023-02-01 01:15:12 141
原创 第27天|LeetCode455. 分发饼干、LeetCode376. 摆动序列、LeetCode53. 最大子数组和
1.上下有平坡:此时我们要么删掉左边的平坡,要么删掉右边的,这里选择删掉左边的,保留右边的,即prediff = 0 + curdiff < 0||prediff = 0 + curdiff > 0,和上面判断摆动合并就是if(prediff >= 0 && curdiff < 0 || prediff 0)误区:不是遇到负数就跳过然后以下一个位置为新起点计算连续和,eg:1,99,-1,9这个数组如果遇到-1就跳过然后以9为新的开始,那么结果就不对了。
2023-01-31 01:46:50 104
原创 第26天|LeetCode332.重新安排行程、LeetCode51.N皇后、LeetCode37. 解数独
①安排行程问题:二刷再来。②N皇后问题:1)是处理二维数组的过程,我们在节点位置的for处理的是同一行的不同列,而递归则是进行不同行的处理。2)要注意终止条件是当row == n的时候才收集棋盘,因为如果 row == n-1的时候就收集的话,那么相当于最后一行还没处理。3)而在写判断某个位置放Q是否合法的函数时候,我们要注意的就是,对角线处理(45°和135°都要处理)。4)在本题中最后的返回结果是链表型的,那么我们收集的二维数组(棋盘)就要转成链表型的,故还要写的转换函数。
2023-01-30 03:56:49 48
原创 第25天|LeetCode491. 递增子序列、LeetCode46. 全排列、LeetCode47. 全排列 II
①第一题,我们要进行去重不能排序,那么我们在递归的每一层都创建一个used数组来保证取到了重复的元素就跳过,所以其不用进行回溯,因为每一层都会新建一个。②其收集结果的位置和子集一样,都是在节点处收集,只不过要求了序列长度>=2;③最后求的是递增的子序列,所以path中的最后一个元素值如果大于新加入的元素值,就跳过。④第二、三题都是排列问题,排列问题中必须要用到used数组来保证不取同一个元素多次;同时如果排列问题中有重复元素要去重,就和组合问题,集合问题的去重一样都是树层去重,也是用used数组。
2023-01-28 04:00:13 85
原创 第24天|LeetCode93. 复原 IP 地址、LeetCode78. 子集、LeetCode90. 子集 II
①第一题还是延续了昨天的分割问题,要清楚startIndex和i之间代表了分割的区间。②第一题在写终止条件的时候要注意最后一个分割的ip地址要考虑是否合法。③第一题要注意如果不合法直接break而不是continue,因为当发现了非法的字符了,那在那一层接着分割下去都是非法的。④第一题要注意java中substring的两种使用方法。⑤第二第三题都是一道题,核心就是收集结果的时候要在每一个节点上收集,所以在进入下层递归的刚开始的地方就要收集结果。
2023-01-27 03:55:59 43
原创 第23天|LeetCode39. 组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串
①前两题依旧是组合问题,其中一个是一个元素可以用多次,一个元素只能用一次涉及到了startIndex的变化。还有的不同就是第二题中数组中有重复的数字,那么我们就必须进行去重,用used数组或者i和startIndex之间的关系,而在回溯的去重操作中基本都会使用continue。②两题都可以进行剪枝(用了break),即先将数组排序,然后再剪枝。③break是跳出本层循环回到上层循环中,continue是跳到本层循环体中。④回文串分割要能理解startIndex和i之间的关系,以组成每一个回文子串;
2023-01-26 06:25:15 71
原创 第22天|LeetCode216.组合总和III、LeetCode17.电话号码的字母组合
①第一题其实就是组合问题加了控制条件,即和为多少,同样的递归回溯。剪枝就多了一步因为涉及到了Sum和targetSum之间的关系。②第二题和回溯前两题不一样的地方是,前两题是在同一个集合里面组合,而此题是在不同的集合间进行组合,所以要注意的是纵向的每次都要选另外一个集合进行组合(这里就是递归调用);而且此题要解决好映射关系,以及取元素对应的字符串的时候要注意要将字符型的数字转成int型,再去映射数组中找到对应的字符串。
2023-01-25 03:56:35 51
原创 第21天|回溯基础及LeetCode77组合
①回溯函数也指递归函数,因为没有单独的回溯算法,所以一般会体现回溯。②回溯其实也是个暴力搜索,只不过如果用for循环 例如:一共100个数,1~100,求50个数的集合,那就要嵌套50层for循环,如果要是数值更大那根本就解决不了,所以回溯登场了。③回溯法可以解决的问题:1.集合问题(无序的):例如给一个集合(1,2,3,4),找到大小为2的集合,eg:12,13,14,23,24,34.2.切割问题:给一个字符串有几种切割方式/给一个字符串如何切割才能保证其是字节回文串。
2023-01-20 03:13:06 45
原创 第20天|LeetCode669. 修剪二叉搜索树、LeetCode108.将有序数组转换为二叉搜索树、LeetCode538.把二叉搜索树转换为累加树
所以根节点的选择,就正好在有序数组的中间位置,当然不论个数是奇数个还是偶数个都无所谓(因为无论是奇数还是偶数个都可以保证其左右子树的深度差不超过1),那样只不过是二叉搜索树的结构不同,但仍然是二叉搜索树。4)单层逻辑---先获取根节点,在数组中获取后,new一个根节点,然后建立其左子树---root.left = (nums, left, mid-1)。①三题都是关于二叉搜索树的---将区间外的元素删除,有序数组构造树,二叉累加树。①返回值---TreeNode,即返回处理完后的新树的根节点。
2023-01-19 10:13:32 78
原创 第19天|LeetCode235. 二叉搜索树的最近公共祖先、LeetCode701. 二叉搜索树中的插入操作、LeetCode450. 删除二叉搜索树中的节点
①三道题都是关于二叉搜索树的,求最近祖先,插入元素,删除元素。②要利用二叉搜索树的特性即右>中>左。③所以在求公共祖先的时候,判断完全大于和全小于后就直接else了这是普通数不具备的特征④插入元素也一样,因为我们必然能在二叉搜索树的节点下面找到合适的位置插入元素⑤删除元素呢-分了共5种情况,最后一种情况最复杂,也利用到了二叉搜索树的特性---即左
2023-01-18 09:51:34 66
原创 第18天|LeetCode530.二叉搜索树的最小绝对差、LeetCode501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
①今天前两题都是关于二叉搜索树的,即求任意最小值和众数,都要用到中序遍历其单调递增的特性,同时也沿用了昨天双指针的思想,即在遍历树的时候也可以用双指针来做。②最后一题求公共祖先,其实就是节点的左子树或者左节点不为空同时右子树或者右节点不为空,该节点就是最近公共祖先。当然在写终止条件的时候也处理了一个节点为另一个节点的父节点的情况,即直接返回root即可。
2023-01-17 04:37:29 81
原创 第17天|LeetCode654. 最大二叉树、LeetCode617. 合并二叉树、LeetCode700. 二叉搜索树中的搜索、LeetCode98. 验证二叉搜索树
①今天学习了构造最大二叉树---给一个区间取最大的为根,然后左区间构建左子树,右区间构建右子树,左子树中构建规则也是这样。②二叉树合并---即同时操作两个二叉树,其终止条件要注意,当root1 == null的时候,return的是root2的右子树,而不是单个节点。③二叉搜索树的搜索---给一个值val找树中有没有,有就返回子树。递归或者迭代都比较简单,都是在判断val和root.val,如果比root.val大就向右找,如果比root.val小就向左找。
2023-01-16 06:48:42 60
原创 第16天|LeetCode513.找树左下角的值、LeetCode112. 路径总和、LeetCode113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉
①第一题两种解法都行,但层序遍历逻辑更好理解。②第一二三题都涉及到了回溯,但是第二题为什么没有加回来,现在还是不是完全明白。是因为传入的是targetSum,而传到第一层的时候,target就应该变成target-root.val,然后向左找结束后向右找,此时本层中的targetSum并没有发生变化吗?其实我们定义递归函数里面的那个targetSum,代表的是本层root之前targetSum的值,而到了本层再发生变化。
2023-01-14 14:57:08 61
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人