algorithm/problem/leetcode/3148
3148. 矩阵中的最大得分(1820)
给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格(不必相邻)。从值为 c1 的单元格移动到值为 c2 的单元格的得分为 c2 - c1 。
你可以从 任一 单元格开始,并且必须至少移动一次。
返回你能得到的 最大 总得分。
示例 1:
**输入:**grid = [[9,5,7,3],[8,9,6,1],[6,7,14,3],[2,5,3,1]]
**输出:**9
**解释:**从单元格 (0, 1) 开始,并执行以下移动:
- 从单元格 (0, 1) 移动到 (2, 1),得分为 7 - 5 = 2 。
- 从单元格 (2, 1) 移动到 (2, 2),得分为 14 - 7 = 7 。
总得分为 2 + 7 = 9 。
示例 2:
**输入:**grid = [[4,3,2],[3,2,1]]
输出:-1
**解释:**从单元格 (0, 0) 开始,执行一次移动:从 (0, 0) 到 (0, 1) 。得分为 3 - 4 = -1 。
提示:
m == g ...
algorithm/problem/leetcode/2858
2851. 字符串转换(2858)
给你两个长度都为 n 的字符串 s 和 t 。你可以对字符串 s 执行以下操作:
将 s 长度为 l (0 < l < n)的 后缀字符串 删除,并将它添加在 s 的开头。
比方说,s = 'abcd' ,那么一次操作中,你可以删除后缀 'cd' ,并将它添加到 s 的开头,得到 s = 'cdab' 。
给你一个整数 k ,请你返回 恰好 k 次操作将 s 变为 t 的方案数。
由于答案可能很大,返回答案对 10^9 + 7 取余 后的结果。
示例 1:
12345678910输入:s = "abcd", t = "cdab", k = 2输出:2解释:第一种方案:第一次操作,选择 index = 3 开始的后缀,得到 s = "dabc" 。第二次操作,选择 index = 3 开始的后缀,得到 s = "cdab" 。第二种方案:第一次操作,选择 index = 1 开始的后缀,得到 s = "bcda" 。第二次操作,选择 i ...
algorithm/problem/leetcode/509
509. 斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
12F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
123输入:n = 2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
123输入:n = 3输出:2解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
123输入:n = 4输出:3解释:F(4) = F(3) + F(2) = 2 + 1 = 3
提示:
0 <= n <= 30
一维线性dp
123456789101112class Solution { public int fib(int n) { if (n == 0) return 0; int f[] = new int[n+1]; f[0] = 0 ...
algorithm/problem/leetcode/3202
3202. 找出有效子序列的最大长度 II(1974)
给你一个整数数组 nums 和一个 正 整数 k 。
nums 的一个
子序列
sub 的长度为 x ,如果其满足以下条件,则称其为 有效子序列 :
(sub[0] + sub[1]) % k == (sub[1] + sub[2]) % k == ... == (sub[x - 2] + sub[x - 1]) % k
返回 nums 的 最长****有效子序列 的长度。
示例 1:
**输入:**nums = [1,2,3,4,5], k = 2
**输出:**5
解释:
最长有效子序列是 [1, 2, 3, 4, 5] 。
示例 2:
**输入:**nums = [1,4,2,3,1,4], k = 3
**输出:**4
解释:
最长有效子序列是 [1, 4, 1, 4] 。
提示:
2 <= nums.length <= 10^3
1 <= nums[i] <= 10^7
1 <= k <= 10^3
值域dp
1234567891011121314151617class Sol ...
algorithm/problem/leetcode/2501
2501. 数组中最长的方波(1480)
给你一个整数数组 nums 。如果 nums 的子序列满足下述条件,则认为该子序列是一个 方波 :
子序列的长度至少为 2 ,并且
将子序列从小到大排序 之后 ,除第一个元素外,每个元素都是前一个元素的 平方 。
返回 nums 中 最长方波 的长度,如果不存在 方波 则返回 -1 。
子序列 也是一个数组,可以由另一个数组删除一些或不删除元素且不改变剩余元素的顺序得到。
示例 1 :
1234567输入:nums = [4,3,6,16,8,2]输出:3解释:选出子序列 [4,16,2] 。排序后,得到 [2,4,16] 。- 4 = 2 * 2.- 16 = 4 * 4.因此,[4,16,2] 是一个方波.可以证明长度为 4 的子序列都不是方波。
示例 2 :
123输入:nums = [2,3,5,6,7]输出:-1解释:nums 不存在方波,所以返回 -1 。
提示:
2 <= nums.length <= 10^5
2 <= nums[i] <= 10^5
12345678910111213141516 ...
algorithm/problem/leetcode/2901
2901. 最长相邻不相等子序列 II(1899)
给你一个整数 n 和一个下标从 0 开始的字符串数组 words ,和一个下标从 0 开始的数组 groups ,两个数组长度都是 n 。
两个长度相等字符串的 汉明距离 定义为对应位置字符 不同 的数目。
你需要从下标 [0, 1, ..., n - 1] 中选出一个 最长子序列,将这个子序列记作长度为 k 的 [i0, i1, ..., ik - 1] ,它需要满足以下条件:
相邻 下标对应的 groups 值 不同。即,对于所有满足 0 < j + 1 < k 的 j 都有 groups[ij] != groups[ij + 1] 。
对于所有 0 < j + 1 < k 的下标 j ,都满足 words[ij] 和 words[ij + 1] 的长度 相等 ,且两个字符串之间的 汉明距离 为 1 。
请你返回一个字符串数组,它是下标子序列 依次 对应 words 数组中的字符串连接形成的字符串数组。如果有多个答案,返回任意一个。
子序列 指的是从原数组中删掉一些(也可能一个也不删掉)元素,剩余元素不 ...
algorithm/problem/leetcode/2140
2140. 解决智力问题(1709)
给你一个下标从 0 开始的二维整数数组 questions ,其中 questions[i] = [pointsi, brainpoweri] 。
这个数组表示一场考试里的一系列题目,你需要 按顺序 (也就是从问题 0 开始依次解决),针对每个问题选择 解决 或者 跳过 操作。解决问题 i 将让你 获得 pointsi 的分数,但是你将 无法 解决接下来的 brainpoweri 个问题(即只能跳过接下来的 brainpoweri 个问题)。如果你跳过问题 i ,你可以对下一个问题决定使用哪种操作。
比方说,给你 questions = [[3, 2], [4, 3], [4, 4], [2, 5]] :
如果问题 0 被解决了, 那么你可以获得 3 分,但你不能解决问题 1 和 2 。
如果你跳过问题 0 ,且解决问题 1 ,你将获得 4 分但是不能解决问题 2 和 3 。
请你返回这场考试里你能获得的 最高 分数。
示例 1:
1234567输入:questions = [[3,2],[4,3],[4,4],[2,5]]输出:5解释 ...
algorithm-problem-leetcode-2944
2944. 购买水果需要的最少金币数(1709)
你在一个水果超市里,货架上摆满了玲琅满目的奇珍异果。
给你一个下标从 1 开始的数组 prices ,其中 prices[i] 表示你购买第 i 个水果需要花费的金币数目。
水果超市有如下促销活动:
如果你花费 price[i] 购买了下标为 i 的水果,那么你可以免费获得下标范围在 [i + 1, i + i] 的水果。
注意 ,即使你 可以 免费获得水果 j ,你仍然可以花费 prices[j] 个金币去购买它以获得它的奖励。
请你返回获得所有水果所需要的 最少 金币数。
示例 1:
**输入:**prices = [3,1,2]
**输出:**4
解释:
用 prices[0] = 3 个金币购买第 1 个水果,你可以免费获得第 2 个水果。
用 prices[1] = 1 个金币购买第 2 个水果,你可以免费获得第 3 个水果。
免费获得第 3 个水果。
请注意,即使您可以免费获得第 2 个水果作为购买第 1 个水果的奖励,但您购买它是为了获得其奖励,这是更优化的。
示例 2:
**输入:**prices = [1,10 ...
algorithm-problem-leetcode-2896
2896. 执行操作使两个字符串相等(2172)
给你两个下标从 0 开始的二进制字符串 s1 和 s2 ,两个字符串的长度都是 n ,再给你一个正整数 x 。
你可以对字符串 s1 执行以下操作 任意次 :
选择两个下标 i 和 j ,将 s1[i] 和 s1[j] 都反转,操作的代价为 x 。
选择满足 i < n - 1 的下标 i ,反转 s1[i] 和 s1[i + 1] ,操作的代价为 1 。
请你返回使字符串 s1 和 s2 相等的 最小 操作代价之和,如果无法让二者相等,返回 -1 。
注意 ,反转字符的意思是将 0 变成 1 ,或者 1 变成 0 。
示例 1:
1234567输入:s1 = "1100011000", s2 = "0101001010", x = 2输出:4解释:我们可以执行以下操作:- 选择 i = 3 执行第二个操作。结果字符串是 s1 = "1101111000" 。- 选择 i = 4 执行第二个操作。结果字符串是 s1 = "1101001000" 。 ...
algorithm-dp-game-theory
博弈dp
一人最大化得分,一人最小化得分
3283. 吃掉所有兵需要的最多移动次数