算法刷题
文章平均质量分 85
用于记录刷题过程
柒柒要开心
一个菜鸟,还在努力地学习
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【算法刷题】Day34
count[i] 表示:以i位置元素为结尾的所有的子序列中,最长递增子序列的 “个数”len[i] 表示:以ì位置元素为结尾的所有的子序列中,最长递增子序列的 “长度”dp[i] 表示:以i位置元素为结尾的所有数对链中最长的数对链的长度。给定一个未排序的整数数组 nums , 返回最长递增子序列的个数。if(root == 叶子节点)使用两个全局变量 + 中序遍历。预处理,按第一个元素排序即可。注意 这个数列必须是。两个表都初始化为 1。原创 2024-03-22 10:28:50 · 959 阅读 · 0 评论 -
【算法刷题】Day33
f[i] 表⽰:以 i 位置元素为结尾的所有的⼦序列中,最后⼀个位置呈现「上升趋势」的最⻓摆动序列的⻓度。g[i] 表⽰:以 i 位置元素为结尾的所有的⼦序列中,最后⼀个位置呈现「下降趋势」的最⻓摆动序列的⻓度。f[i] 表示:以 i 位置元素为结尾的所有子数组中,最后呈现「上升状态」下的最长湍流数组的长度。g[i] 表示:以 i 位置元素为结尾的所有子数组中,最后呈现「下降状态」下的最长湍流数组的长度。如果状态表⽰这样定义的话,以 i 位置为结尾的最⻓摆动序列的⻓度我们没法从之前的状态推导出来。原创 2024-03-21 08:35:47 · 925 阅读 · 0 评论 -
【算法刷题】Day32
叶子节点 要么值为 0 要么值为 1 ,其中 0 表示 False ,1 表示 True。dp[i] 表示:以 i 位置的元素为结尾的所有子串里面,有多少个在 base 中出现过。给一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。dp[i] 表示: [0, i] 区间内的字符串,能否被字典中的单词拼接而成。例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123。这⾥不能直接返回 dp 表里面的和,因为会有重复的结果。最后返回「数组中所有元素的和」即可。原创 2024-03-18 10:33:54 · 644 阅读 · 0 评论 -
【算法刷题】Day31
f[i] 表示:以 i 结尾的所有子数组中,乘积为「正数」的最长子数组的长度。g[i] 表示:以 i 结尾的所有子数组中,乘积为「负数」的最长子数组的长度。dp[i] 表示:「以 i 位置的元素为结尾」的等差数列有多少种。返回数组 nums 中所有为等差数组的 子数组 个数。f[i] 表示:以 i 结尾的所有⼦数组的最大乘积。g[i] 表示:以 i 结尾的所有⼦数组的最小乘积。在 f 表中,要求 f[i - 1] 不影响 +1。求出乘积为正数的最长子数组的长度。一个是暴力循环,一个是快速幂。原创 2024-03-14 11:26:23 · 955 阅读 · 0 评论 -
【算法刷题】Day30
选择两个头结点中较小的结点作为最终合并后的头结点,然后将剩下的链表交给递归函数去处理。dp[i] 表示:以 i 位置为结尾的所有子数组中的最大和。单链表的头节点 head ,反转链表,并返回反转后的链表。将x柱子上的一堆盘子,借助 y柱子,转移到z 柱子上面。新链表是通过拼接给定的两个链表的所有节点组成的。返回 nums 的非空 子数组 的最大可能和。只关心一个子问题咋做什么(函数体的设计)长度为 n 的环形整数数组 nums。找出一个具有最大和的连续子数组。重复子问题(函数头的设计)原创 2024-03-08 11:02:21 · 912 阅读 · 0 评论 -
【算法刷题】Day29
当处于第 0 天的时候,只能处于「买⼊过⼀次」的状态,此时的收益为 -prices[0] ,因此 f[0][0] = - prices[0]f[i][j] 表示:第 i 天结束后,完成了 j 笔交易,此时处于「有股票」状态的最大收益;g[i][j] 表示:第 i 天结束后,完成了 j 笔交易,此时处于「无股票」状态的最大收益。为了取 max 的时候,⼀些不存在的状态「起不到⼲扰」的作⽤,我们统统将它们初始化为 -INF。r,o,a,k 去查找前驱字符,是否在哈希表中。如果存在,最后一个字符–,当前字符++原创 2024-03-06 15:05:07 · 446 阅读 · 0 评论 -
【算法刷题】Day28
f[i][j] 表示:第 i 天结束之后,完成了 j 次交易,此时处于“买入”状态下的,最大利润。g[i][j] 表示:第 i 天结束之后,完成了 j 次交易,此时处于“卖出”状态下的,最大利润。第 k 行:(k, d-k) 到 (k+d, d-k+d) 到 (k+2d, d-k+2d)第 n-1 行:n-1 到 n-1+d 到 n-1+2d…dp[i] 表示:第 i 天结束之后,所能获得的最大利润。第 i 个元素是一支给定的股票在第 i 天的价格。第一行:0 到 0+d 到 0+2d…原创 2024-01-09 19:48:40 · 1320 阅读 · 0 评论 -
【算法刷题】Day27
在时间区间 [t, t + duration - 1](含 t 和 t + duration - 1)处于中毒状态。f[i] 表示:第 i 天结束之后,处于”买入“状态,此时的最大利润。g[i] 表示:第 i 天结束之后,处于”卖出“状态,此时的最大利润。dp[i] 表示:第 i 天结束的之后,所能获得的最大利润。在中毒影响结束 前 再次攻击,中毒状态计时器将会 重置。prices[i]表示第 i 天的股票价格。这个时候可以直接返回,g[n - 1]在买入状态的时候,肯定不会是最大利润。原创 2024-01-02 09:45:09 · 872 阅读 · 1 评论 -
【算法刷题】Day26
dp[i][1] 表示:第 i 天结束之后,处于“可交易”状态,此时最大利润。dp[i][2] 表示:第 i 天结束之后,处于“冷冻期”状态,此时最大利润。dp[i][0] 表示:第 i 天结束之后,处于“买入”状态,此时最大利润。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)prices[i] 表示第 i 天的股票价格。’ 字符的字符串 s。最终的字符串不包含任何 连续重复 的字符。’ 转换为若干小写字母。箭头所指的是当前的状态。原创 2023-12-28 21:52:53 · 399 阅读 · 0 评论 -
【算法刷题】Day25
每⼀个「比特位」代表⼀个「字符」,⼀个 int 类型的变量的 32 位足够表示所有的小写字⺟。dp[i][0] 表示:粉刷到 i 位置的时候,最后⼀个位置粉刷上「红色」,此时的最小花费。dp[i][1] 表示:粉刷到 i 位置的时候,最后⼀个位置粉刷上「蓝色」,此时的最小花费。dp[i][0] 表示:粉刷到 i 位置的时候,最后⼀个位置粉刷上「绿色」,此时的最小花费。我们通过 ret 的每⼀个比特位上的值,就可以将 ret 给还原出来。costs[0][0] 表示第 0 号房子粉刷成红色的成本花费。原创 2023-12-28 21:39:45 · 1006 阅读 · 0 评论 -
【算法刷题】Day24
所以dp[i][j] = dp[i-1][j] +dp[i][j-1] - dp[i-1][j-1] +arr[i+1][j+1]删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。g[i] 表示:选到 i 位置时,不选 nums[i],此时能获得的最大点数。f[i] 表示:选到 i 位置时,选 nums[i],此时能获得的最大点数。在 [0,i-1] 区间内,有多少个前缀和 等于 sum[i] - k。选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。原创 2023-12-26 16:27:41 · 153 阅读 · 0 评论 -
【算法刷题】Day23
在 [0,i-1] 区间内,找到有多少个前缀和的余数等于 (sum % k + k) % k。g[i] 表示:偷到 i 位置时,不偷 nums[i],此时的最大金额。在 [0,i-1] 区间内,有多少个前缀和 等于 sum[i] - k。f[i] 表示:偷到 i 位置时,偷 nums[i],此时的最大金额。因为有负数的原因,中间的可能会出现相加为 0 的情况。并且 (a + p*k) % p = a % p。为了正负统一:(a % p + p) % p。在不偷的情况下,后面的就跟昨天的按摩师一样。原创 2023-12-22 18:44:34 · 150 阅读 · 0 评论 -
【算法刷题】Day22
f[i] 表示:选择到 i 位置时, nums[i] 必选,此时的最⻓预约时长。g[i] 表示:选择到 i 位置时, nums[i] 不选,此时的最长预约时长。因此 g[i] = max(f[i - 1], g[i- 1])因此 f[i] = g[i - 1] + nums[i]g[i] 表示:[i+1,n-1] 区间,所有元素的乘积。g[i] 表示:[i+1,n-1] 区间,所有元素的和。f[i] 表示:[0,i-1] 区间,所有元素的乘积。f[i] 表示:[0,i-1] 区间,所有元素的和。原创 2023-12-21 21:39:02 · 187 阅读 · 0 评论 -
【算法刷题】Day21
输出以(x1,y1) 为左上角 和 (x2,y2)为右下角的子矩阵和。dp[i][j] 表示:从[1,1] 位置,这段区间里面所有元素的和。[x1,y1] ~ [x2,y2] 就是求 D 这一块的值。dp[i] 表示:[1,i] 区间内所有元素的和。有 q 次查询,每次有两个参数 l 和 r。需要 dp[r] - dp[l-1]因为如果是 0,-1就会数组异常。(1)预处理出来一个前缀和数组。(1)预处理出来一个前缀和矩阵。这个时间复杂度是 O(n)要求 [l,r] 中间的和。(2)使用前缀和数组。原创 2023-12-20 19:03:00 · 149 阅读 · 0 评论 -
【算法刷题】Day20
添加⼀行」,并且「添加⼀列」后,所有位置的值可以初始化为无穷大,然后让 dp[0][1] = dp[1][0] = 1。根据例子我们可以看出来,数字和下标是一一对应的,这样我们就可以找开始不对应的那个数字。dp[i][j] 表示:到达 [i, j] 位置处,最小路径和是多少。如果 dp[i][j] 表示到达 [i, j] 位置处的最小路径和。dp[i] 表示:以 i 位置元素为结尾的所有子数组的最大和。当数组为升序数组,该返回 4 的时候,我们需要怎么做?当区间⻓度变成 1 的时候,就是我们要找的结果。原创 2023-12-19 21:39:25 · 691 阅读 · 0 评论 -
【算法刷题】Day19
dp[i][j] 表示:到达 [i, j] 位置时,所有下降路径中的最小和。我们要的是三种情况下的「最小值」,然后再加上矩阵在 [i, j] 位置的值。所有的位置都初始化为无穷大,然后将第⼀行初始化为 0 即可。可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。在本题中,需要「加上⼀行」,并且「加上两列」峰值元素:严格大于左右相邻的元素。返回「dp表中最后⼀行的最小值」1 可以向下、向左下、向右下。目标是左边的:左边小于右边。目标值右边的:左边大于右边。比如示例一,就有两种情况。首先,这道题有三种情况。原创 2023-12-18 10:55:04 · 173 阅读 · 0 评论 -
【算法刷题】Day18
dp[i][j] 表示:走到 [i, j] 位置处,此时的最大价值。在本题中,「添加⼀行」,并且「添加⼀列」后,所有的值都为 0 即可。给一个 x 计算返回 x 的算数平方根。要求时间复杂度 O(log n)有一个排序数组 和 一个目标值。求从 △ 到 ☆ 拿的最大价值。格子中的每个数都是珠宝的价值。在表格上面和左边加一行和一列。不能使用指数函数 和 算符。不存在返回应该插入的位置。注意:只能向右和向下拿。原创 2023-12-17 11:18:30 · 127 阅读 · 0 评论 -
【算法刷题】Day17
原题链接。原创 2023-12-16 10:49:18 · 717 阅读 · 0 评论 -
【算法刷题】Day16
在一个数组中,拿到目标值 在数组中查找,发现可以划分为两端的区域。(二分查找并不一定在有序数组,满足“二段性”就可用)n 个元素有序的数组,找到 target,返回下标。机器人只能向下和向右走,不能回退(向上或者向左)并且可以选择性的舍去一段,在另一段进行查找。从头开始遍历,遇到 target 返回。使用“二分查找”,在遇到“原创 2023-12-15 10:00:59 · 197 阅读 · 0 评论 -
【算法刷题】Day15
s 中的 串联⼦串 是指⼀个包含 words中所有字符串以任意顺序排列连接起来的⼦串。如果hash2 中 A 的个数 = hash1 中 A 的个数才算有效。这道题和 Day14 中 所写的找到字符串所有字母异位词 很像。所以我们就可以把每一个字符串划分为长度相等的小字符串。给定⼀个字符串 s 和⼀个字符串数组 words。返回 s 中涵盖 t 中所有字符串的最小子串。s 中我们也可以根据相同的长度进行划分。因为 words 中所有字符串。words 中所有字符串。有字符串 s 和 t。原创 2023-12-14 17:30:34 · 185 阅读 · 0 评论 -
【算法刷题】Day14
再判断出的字母是否是多余的(> 是多余的),如果是字母的计数改变,count 不变。如果 kinds > 2 就说明水果的种类超过了两种,这个时候 left++转化:找出一个最长的子数组的长度,子数组中不超过两种类型的水果。异位词:由相同字母重排序形成的字符串(包括相同的字符串)进窗口的时候判断这个字母是否 <= p 中的字母个数。由于在判断中,我们要知道在哪里能找到真正的出窗口。<= count++;出窗口的时候,先判断进来的是否 <= p 中的。在 s 中找到所有 p 的异位词的子串。原创 2023-12-13 09:00:00 · 251 阅读 · 0 评论 -
【算法刷题】Day13
dp[i] = dp[i-1] + dp[i-2] (只用在成功的时候才能加上)这样我们可以看出来,在进行编码时,一定需要看到前面的数能不能和后面的数进行结合。显然是可以的,这个时候,我们就需要创建一个新的dp数组,借用到了一个虚拟节点。在我们看到上面的代码,发现在初始化dp[1] 和 在循环中的代码非常类似。在上面的题干解析中,我们通过图可以发现,我们要找的是左边加右边等于 x。如果开始相加,就说明可以解码成功,这个时候dp[0] 就肯定不是 0。这个时候dp[1] 和以前的 dp[0] 是一样的。原创 2023-12-05 15:05:33 · 281 阅读 · 0 评论 -
【算法刷题】Day12
要大胆的去想状态表示和状态转移方程。原创 2023-12-04 18:36:26 · 193 阅读 · 0 评论 -
【算法刷题】Day11
是由于单调性的原因,在上面的一步步优化的时候就可以知道,当这个区间的和大于目标值之后,后面的值加进来肯定要大于目标值,但是这里区间长度也会增加,所以后面的值就不可能是求的值。当 right 走到sum = 8的时候,往后走,虽然和在增加,但是长度也在增加,所以后面的并不是最佳答案。如果是四阶台阶,经过1到4有一种,经过2到4有两种,经过3到4有四种,所以一共有七种。如果是三节台阶,从0到3有一种,经过1到3有一种,经过2到3有一种,所以是四种。如果是两节台阶,从0到1有一种,经过1到2有一种,所以是两种。原创 2023-12-03 10:56:39 · 241 阅读 · 0 评论 -
【算法刷题】Day10
(2)在 a 后面的区间内,利用“三数之和”找到三个数(和上面题的方法一样),使这三个数的和等于 target - a。在 left 和 right 向中间走的时候,找到一个数等于固定的数的负数,不能停下,继续缩小区间,寻找下一个。(3)在该数后面的区间内,利用“双指针算法”快速找到两个数的和等于 -a 即可。这里进行排序是为了从前向后遍历的时候,可以更好的用双指针进行操作。这道题跟上面的三数之和非常相似,因此下面的解题思路也是非常相似。由于题目要求,不能返回相同的数组,所以要求去重。原创 2023-12-01 17:47:35 · 306 阅读 · 0 评论 -
【算法刷题】Day9
这个时候,我们想,如果让这个数组是有序的,对比的这三个边是有序的,那么两个较短的边相加,大于第三边,是不是就可以说明前面两条边任意一条和后面的相加,都大于其余一条边呢?让left + right,如果大于 最后一个数字,那么left 右边的所有数字和 right 相加都大于,所以中间的统计下来,right –我们一般的判断都是任意两边之和大于第三边,但是如果在时间复杂度的位置上考虑,比三次太麻烦。我们先看这个数组,我们先把最后一个数字固定,定义 left 和 right,如果 大于 t ,right–原创 2023-11-30 08:54:00 · 362 阅读 · 0 评论 -
【算法刷题】Day8
原题链接](https://leetcode.cn/problems/container-with-most-water/先看题干,貌似就是求体积,再看示例,就是求两段之间最小的那个值 乘 两段之间的差值。判断是不是快乐数,就是看入环的数字是几,如果是 1 那么就是快乐数。这样我们可以直接删去 4 ,从 6 开始向 5 进行遍历。利用这样的规律,我们在看原数组,我们就可以这样解题。画完图我们就可以发现,这个跟曾经数据结构学过的。所以如果 4 不变,从右向左一个一个计算体积。拿到题,我们先看题干。原创 2023-11-29 10:05:03 · 283 阅读 · 0 评论 -
【算法刷题】Day7
我们这里可以运用**“双指针”**的方法这里的双指针,并不是 c 语言中的指针,而是用数组模拟的指针。看到题目,首先看一下题干的要求,是在原数组内进行操作,平切保持非零元素的相对顺序。遇到非零元素:swap(dest+1,cur);首先先看题干,把数组中每个零都复写一遍,其他元素水平右移,并且就地修改。这个时候,数组就被 cur 和 dest 分成了三个区间。dest:已处理的区间内,在非零元素的最后一个位置。我们要定义两个“指针”,cur 和 dest。[ dest+1, cur-1 ] 0元素。原创 2023-11-28 22:38:12 · 242 阅读 · 0 评论 -
【算法刷题】Day6
但是要考虑到正负号的问题。我们这里用链表的方式来写。很简单的斐波那契额数列。可以直接用公式算出来。也可以用迭代或者递归。原创 2023-11-16 22:34:39 · 178 阅读 · 0 评论 -
【算法刷题】Day5
但是由于是要循环判断的,所以外层需要一层没有条件的for 循环,如果满足内部条件,直接break。跟上一题对比,这一题很简单,用一个循环在里面判断求和与k 对比就可以了。看到这道题的题干,我们可以画个图来展示。由此看出来,这是个循环结构。内层循环是每一层的天数。原创 2023-11-11 22:19:31 · 130 阅读 · 0 评论 -
【算法刷题】Day4
在输入的每个数字的时候,把个位与十位相加算出来。定义一个key,来进行大小比较,并输出。如果A和B的数量相等,那就输出Yes。创建一个数组来存放个位与十位相加的值。创建一个顺序表,用来存储没有消除的。把输入的一串字符转化为字符数组。分类讨论,看输入的字符是多少个。如果A比B的数量多,就输出A。如果A比B的数量少,就输出B。遍历数组,统计A和B的数量。这是一个很奇妙的方法。原创 2023-11-10 20:47:17 · 113 阅读 · 0 评论 -
【算法刷题】Day3
再把输入的x转换成字符,并且和拆分的字符进行对比。用count 进行计数,输出count。我们先把输入的数字转化成字符。把输入的数字进行拆分。原创 2023-11-08 09:11:55 · 131 阅读 · 0 评论 -
【算法刷题】Day2
在休伯利安号上的你是位数据分析师,你的工作职责是负责接受A,B两艘副舰的密钥,请你判断出B密钥里的内容是否在A密钥里面,如果在请将B密钥在A密钥的第一次出现的位置发送给舰桥,如果A密钥中没有B密钥,则发送“NO”。牛桑最近喜欢上了smoke,但他有一个习惯,他每吸完一根烟就会把烟蒂保存下来,正好东校地超有个活动(不是真的),可以拿3个烟蒂换取一根烟,烟的价格为5元一根,现在牛桑有n元,请你帮他算出他最多能吸多少烟。现在需要你替监控系统计算一下答案。这道题直接进行判断,当天,这周内,和下周,只有这三种答案。原创 2023-11-07 21:04:15 · 159 阅读 · 0 评论 -
【算法刷题】Day1
但是我们这里要知道一个点, “%11.11s-%s” 这个是极为特殊的输出方式。这可怎么办,看题解吧,完蛋看不懂,什么高精度,尤其还是c++,更看不懂了。最后求助万能的老师,发现了可以使用BigInteger类来解决。我们怎么输入输入的这串字符的前11个 和我们自己计算的后两位。意思是把str 的前11个字符按照输入的格式进行输出。我们要知道怎么把 - 摘出去,再对这串数字进行计算。刚刚看到题的时候,这不简简单单吗,直接上手。我们要解决的是如何把这一串字符输入进去。刚看到这道题,这么多的字,头都大了。原创 2023-11-06 18:00:41 · 178 阅读 · 3 评论
分享