- 博客(54)
- 收藏
- 关注
原创 双指针:比较含退格的字符串
代码看起来繁琐,但实际思想并不难。核心思路是:倒序遍历,遇到#就记录跳过次数,遇到字母就跳过记录次数,最后比较不用跳过时的字母是否一样。
2024-06-26 16:10:52 295
原创 动态规划:买卖股票的最佳时机含冷冻期
本题是买卖股票的最佳时机3的进阶版,多了一个冷冻期的状态,而冷冻期状态依赖前一天卖出的状态,所以不持有状态要被拆开为保持卖出,和卖出状态。
2024-06-11 14:38:02 177
原创 动态规划:买卖股票的最佳时机 II
不持有状态下分为,按照前一天不持有,要不就是按照前一天持有的手头最大现金,卖出当前股票。不持有状态下分为,按照前一天不持有,要不就是按照前一天持有的手头最大现金,卖出当前股票。持有状态下又分为按照前一天不动,要不就是以前一天不持有的手头最大现金买入。持有状态下又分为按照前一天不动,要不就是以前一天不持有的手头最大现金买入。定义一个二维dp数组,i表示第几天,0表示持有,1表示不持有。所以dp[0][0] = -prices[0];所以dp[0][1] = 0;1.确定dp数组含义。所以分为两个递推公式。
2024-06-06 16:51:30 203
原创 动态规划:打家劫舍 II
打家劫舍的解法和背包问题是两种不同的解题思路。打家劫舍2的关键思路在于对不同情况的分析。但同样是依赖于前面的状态推导。考虑首节点,不考虑尾结点。考虑尾结点,不考虑首节点。从这两个里面选取最大值。
2024-06-05 11:27:16 262
原创 动态规划:零钱兑换
dp[j-coins[i]]+1,以amount=4,coins=1,2举例,dp[j-coins[i]]意味着dp[2]时最少用了几枚硬币,再加上自身这枚也就是dp[j-coins[i]]+1。= Integer.MAX_VALUE 防止溢出。dp[0]=0,确定面额为0,只有0个硬币,其他下标初始化为最大值。0-amount,每个面额最小用几个硬币。可以取多次,则正序遍历。1.确定dp数组含义。
2024-05-30 12:09:15 215
原创 动态规划:目标和
因为是求方式数,dp[0]初始化为1,不用非得死扣为什么为1,知道是为了推出正确答案才这么初始化就够了。本次和最后一块石头的重量2有异曲同工之妙,都是要分成两堆。正数的集合总和-负数的集合总和=目标和,那么怎么求出正数的集合;这道题开题解给我看的一脸懵,最后还是靠着手动画图才稍微明白。所以,正数的集合总和-(总和-正数的集合总和)=目标和。很难解释含义,只能靠带入递推公式,手动画表格理解。所以,正数的集合总和=(总和+目标和)/2。负数的集合总和=总和-正数的集合总和。正数的集合总和=最大背包重量。
2024-05-28 14:03:59 215
原创 动态规划:最后一块石头的重量 II
这道题的思路是,将石头分成两堆,两堆石头重量越平衡,相撞后得到的重量最小,而不用考虑具体哪些石头碰出来的。本题上来犯了一个大错,就是被题目的提示带偏了,从被具体怎么分石头迷惑住了,而没有从整体想。石头只能取一次,故从后向前遍历。重量0-n分别能装的最大重量。本题是分割等和子集的变种。1.确定dp数组的含义。固定的背包问题递推公式。
2024-05-27 15:49:40 222
原创 mysql索引优化
对于辅助的联合索引(name,age,position),正常情况按照最左前缀原则,这种情况只会走name字段索引,因为根据name字段过滤完,得到的索引行里的age和position是无序的,无法很好的利用索引。在MySQL5.6之前的版本,这个查询只能在联合索引里匹配到名字是 ‘LiLei’ 开头的索引,然后拿这些索引对应的主键逐个回表,到主键索引上找出相应的记录,再比对age和position这两个字段的值是否符合。
2024-05-24 17:30:35 391
原创 动态规划:分割等和子集
题目中给的nums数组,以nums=[1,5,11,5]为例,可以分析为有4个物品,每个物品的重量为weight=[1,5,11,5],每个物品的价值为value=[1,5,11,5]这道题是01背包问题的抽象,这道题的难点在于怎么绕明白遍历顺序是从后往前。重量从0到maxWeight,分别能装的最大价值。最大容量为:(1+5+11+5)/2。只能选取一次,从后向前。1.确定dp数组含义。
2024-05-24 14:50:06 142
原创 动态规划:01背包问题
因为只能放一个,物品0的重量为1,价值为15,所以背包重量为1的时候,最大价值为15,那么最大重量为2的时候呢,因为只有一个物品0供我们放,所以重量为2时的最大价值依旧为15,初始化后的表格也就是。此时正好可以放一个物品0和一个物品1,也就是当背包重量为3时的最大价值,加上背包重量为1时的最大价值。肯定是物品0,因为物品1超重了,重量为3,所以放不了物品1,选择不放,则继承物品0的价值。肯定是物品0,因为物品1超重了,重量为3,所以放不了物品1,选择不放,则继承物品0的价值。
2024-05-23 16:14:09 356
原创 动态规划:不同的二叉搜索树
以n=3为例,这几种二叉树大体上是由头节点1、2、3组成的,n=3的情况下,有几种二叉树等于头结点1的二叉树数量+头结点2的二叉树数量+头结点3的二叉树数量。那么具体的递推公式是什么,假设n=3,头结点j=1的话,头结点为1的二叉树数量=左子树数量*右子树数量,以此类推加3次,就得出了n个节点有几种二叉树了。本题的dp[0]初始化为1,可以理解为只有1才能推出正确结果,我不认同0个节点它也是二叉树,初始化为1完全就是能推出正确结果。以n=3为例,dp[0]代表0个节点的情况下,能组成几种二叉树。
2024-05-23 14:48:25 673
原创 动态规划:整数拆分
以3为例,3可以被拆分为1*(3-1),或是1*(1*1),那么这个(1*1)又是组成2的,所以从拆分两个数,和拆分为3个以上的数乘积中选择一个最大的。故递推公式为Math.max(1*(3-1),1*dp[3-1]);那么dp[3-1]又代表什么含义,dp[3-1]=dp[2],意味着2拆分后的最大乘积1*1,也意味着上述的1*1*1,意味着Math.max(1*2,1*1*1);为什么不初始化3了,因为3可以被拆分为3个数1,1,1或两个数1,2,并且3可以从前面的数推导出来。1.确定dp数组含义。
2024-05-22 13:46:17 296
原创 动态规划:不同路径 II
此题的解题思路和不同路径 1是一样的,不同点在于网格内出现了障碍物。体现出了初始化的重要性。初始化第一行第一列,遇到障碍物的情况下,障碍物后的走法都为0,符合生活常识。因为后面的状态依赖前面的状态推导,所以选择从前向后遍历。dp数组中每个元素代表网格内每个位置有几种走法。1.确定dp数组含义。
2024-05-22 12:39:48 346
原创 explain详解与索引最佳实践
mysql执行计划explain结果里的key有使用索引,如果select后面查询的字段都可以从这个索引的树中获取,这种情况一般可以说是用到了覆盖索引,extra里一般都有using index;覆盖索引一般针对的是辅助索引,整个查询结果只通过辅助索引就能拿到结果,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值。
2024-05-22 11:45:32 1112
原创 动态规划:不同路径
题意是有一个m*n的网格,所以需要一个m*n大小的dp数组,每个位置代表到达此位置有几条不同的路径。因为机器人每次只能向下或者向右移动一步。所以dp[m][n]位置的路径条数一定是依赖前面的状态。第一行每个位置一定只有1条路径,所以dp[0][0到n]的位置全部初始化为1。第一列每个位置一定只有1条路径,所以dp[0到m][0]的位置全部初始化为1。第i,j位置的路径条数=上一行当前列的条数+当前行上一列。所以需要从前向后遍历。1.确定dp数组含义。
2024-05-21 11:24:08 142
原创 动态规划:使用最小花费爬楼梯
含义:第i阶台阶的最小花费=Math.min(i-1阶台阶已经花的最小花费+从i-1阶开始要花费的,i-2阶台阶已经花的最小花费+从i-2阶开始要花费的)公式为:dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);后面的状态由前面的状态转移过来,所以要从前向后遍历。所以dp[0]=0意味着第0阶开始,已经花费0。所以dp[1]=0意味着第1阶开始,已经花费0。在第i个台阶已经花费的体力/费用。题意:你可以选择从下标为。1.确定dp数组含义。
2024-05-21 10:24:40 561
原创 动态规划:爬楼梯
此题的思路和斐波那契数列是差不多的,都是前一项加前前项的和。唯一的区别在于dp[0]的初始化,正常应该是不初始化dp[0],但要是从第2阶开始推,就必须初始化dp[0]为1才能推出正确答案。dp[0]初始化为1,dp[1]初始化为1,这样可以正确推导出结果。因为后面的结果依赖前面的结果,所以是从前到后遍历。dp数组第n项为第n阶台阶有几种方式到达顶楼。第n项的结果为第n-1项加第n-2项。1.确定dp数组含义。
2024-05-20 14:47:41 208
原创 动态规划:斐波那契数列
根据题意,第三个数是由前面一个数+前前面一个数,所以递推公式为dp[i] = dp[i-1]+d[i-2]。题解可以优化,只需要一个大小为2的dp数组就足够,但为了体现递归的特性,故这么写。根据题意,dp[0]=0,dp[1]=1,这么初始化就够了。由于后面的状态是由前面推导出来的,所以需要从前向后遍历。这道题的dp数组含义是,第n个位置的斐波那锲数。遇到解题错误的情况,打印dp数组排错。5.打印dp数组(可选)1.确认dp数组含义。
2024-05-20 11:20:27 328
原创 贪心算法:划分字母区间
题目的解题思路不难理解。分别统计每个字母最后出现的下标,此处有个小技巧,利用ascii码作差得到每个字母的位置。再遍历一遍字符串,到某个字母的最远下标处开始分割,计算长度。
2024-05-16 13:50:33 220
原创 贪心算法:根据身高重建队列
先根据身高hi维度降序排列,因为ki要求的是前面的都比后面的高。再根据身高相同的降序排列ki。因为要满足ki,所以调整ki位置。
2024-05-14 15:05:04 231
原创 贪心算法:分发糖果
题意,“每个孩子至少分配1个糖果”,从中分析出,用1填满一个ratings大小的数组;“相邻两个孩子评分更高的会获得更多的糖果”,分析出夹在中间的那个孩子糖果数量多余两侧;
2024-05-09 14:22:41 216
原创 贪心算法:加油站
本题贪心算法的思路是算出每一站剩余的油量,如果总耗油量是负的则跑不完一圈。如果能跑完一圈的话则去找起始位置,累加从起始位置的耗油量,如果出现负的,则重新记起始位置。
2024-05-09 11:50:26 242
原创 贪心算法:K 次取反后最大化的数组和
所以需要先对nums进行排序,排序思路为每个数的绝对值倒序排序,这样如果有负数的话第一个数就是最小的,最后一个数肯定为最小的;本题的贪心思路是先在k次内把负数全部变正,再用非负的数消耗完k;
2024-05-08 15:12:31 133 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人