algorithm-problem-leetcode-2911
2911. 得到 K 个半回文串的最少修改次数(2608)
给你一个字符串 s 和一个整数 k ,请你将 s 分成 k 个 子字符串 ,使得每个 子字符串 变成 半回文串 需要修改的字符数目最少。
请你返回一个整数,表示需要修改的 最少 字符数目。
注意:
如果一个字符串从左往右和从右往左读是一样的,那么它是一个 回文串 。
如果长度为 len 的字符串存在一个满足 1 <= d < len 的正整数 d ,len % d == 0 成立且所有对 d 做除法余数相同的下标对应的字符连起来得到的字符串都是 回文串 ,那么我们说这个字符串是 半回文串 。比方说 "aa" ,"aba" ,"adbgad" 和 "abab" 都是 半回文串 ,而 "a" ,"ab" 和 "abca" 不是。
子字符串 指的是一个字符串中一段连续的字符序列。
示例 1:
1234输入:s = "abcac", k = 2输出:1解释:我们 ...
algorithm-problem-leetcode-2707
2707. 字符串中的额外字符(1736)
给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串,每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。
请你采取最优策略分割 s ,使剩下的字符 最少 。
示例 1:
123输入:s = "leetscode", dictionary = ["leet","code","leetcode"]输出:1解释:将 s 分成两个子字符串:下标从 0 到 3 的 "leet" 和下标从 5 到 8 的 "code" 。只有 1 个字符没有使用(下标为 4),所以我们返回 1 。
示例 2:
123输入:s = "sayhelloworld", dictionary = ["hello","world"]输出:3解释:将 s 分成两个子字符串:下标从 ...
algorithm-problem-leetcode-2369
2369. 检查数组是否存在有效划分(1780)
给你一个下标从 0 开始的整数数组 nums ,你必须将数组划分为一个或多个 连续 子数组。
如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分:
子数组 恰 由 2 个相等元素组成,例如,子数组 [2,2] 。
子数组 恰 由 3 个相等元素组成,例如,子数组 [4,4,4] 。
子数组 恰 由 3 个连续递增元素组成,并且相邻元素之间的差值为 1 。例如,子数组 [3,4,5] ,但是子数组 [1,3,5] 不符合要求。
如果数组 至少 存在一种有效划分,返回 true ,否则,返回 false 。
示例 1:
1234输入:nums = [4,4,4,5,6]输出:true解释:数组可以划分成子数组 [4,4] 和 [4,5,6] 。这是一种有效划分,所以返回 true 。
示例 2:
123输入:nums = [1,1,1,2]输出:false解释:该数组不存在有效划分。
提示:
2 <= nums.length <= 10^5
1 <= nums[i] <= 1 ...
algorithm-problem-leetcode-1594
1594. 矩阵的最大非负积(1807)
给你一个大小为 m x n 的矩阵 grid 。最初,你位于左上角 (0, 0) ,每一步,你可以在矩阵中 向右 或 向下 移动。
在从左上角 (0, 0) 开始到右下角 (m - 1, n - 1) 结束的所有路径中,找出具有 最大非负积 的路径。路径的积是沿路径访问的单元格中所有整数的乘积。
返回 最大非负积 对 10^9 + 7 取余 的结果。如果最大积为 负数 ,则返回 -1 。
**注意,**取余是在得到最大积之后执行的。
示例 1:
123输入:grid = [[-1,-2,-3],[-2,-3,-3],[-3,-3,-2]]输出:-1解释:从 (0, 0) 到 (2, 2) 的路径中无法得到非负积,所以返回 -1 。
示例 2:
123输入:grid = [[1,-2,1],[1,-2,1],[3,-4,1]]输出:8解释:最大非负积对应的路径如图所示 (1 * 1 * -2 * -4 * 1 = 8)
示例 3:
123输入:grid = [[1,3],[0,-4]]输出:0解释:最大非负积对应的路径如图所示 (1 * 0 ...
algorithm-problem-leetcode-62
62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
12输入:m = 3, n = 7输出:28
示例 2:
1234567输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右3. 向下 -> 向右 -> 向下
示例 3:
12输入:m = 7, n = 3输出:28
示例 4:
12输入:m = 3, n = 3输出:6
提示:
1 <= m, n <= 100
题目数据保证答案小于等于 2 * 10^9
123456789101112class Solution { public int uniquePaths(int m, int n) { int f[][] = new int[m ...
algorithm-problem-leetcode-2719
2719. 统计整数数目(2355)
给你两个数字字符串 num1 和 num2 ,以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件,我们称它是一个好整数:
num1 <= x <= num2
min_sum <= digit_sum(x) <= max_sum.
请你返回好整数的数目。答案可能很大,请返回答案对 10^9 + 7 取余后的结果。
注意,digit_sum(x) 表示 x 各位数字之和。
示例 1:
123输入:num1 = "1", num2 = "12", min_num = 1, max_num = 8输出:11解释:总共有 11 个整数的数位和在 1 到 8 之间,分别是 1,2,3,4,5,6,7,8,10,11 和 12 。所以我们返回 11 。
示例 2:
123输入:num1 = "1", num2 = "5", min_num = 1, max_num = 5输出:5解释:数位和在 1 到 5 之间的 5 个整数 ...
algorithm-problem-leetcode-2376
2376. 统计特殊整数(2120)
如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。
给你一个 正 整数 n ,请你返回区间 [1, n] 之间特殊整数的数目。
示例 1:
123输入:n = 20输出:19解释:1 到 20 之间所有整数除了 11 以外都是特殊整数。所以总共有 19 个特殊整数。
示例 2:
123输入:n = 5输出:5解释:1 到 5 所有整数都是特殊整数。
示例 3:
1234输入:n = 135输出:110解释:从 1 到 135 总共有 110 个整数是特殊整数。不特殊的部分数字为:22 ,114 和 131 。
提示:
1 <= n <= 2 * 10^9
思路:记忆化搜索dp
123456789101112131415161718192021222324class Solution { public int countSpecialNumbers(int n) { char cs[] = String.valueOf(n).toCharArray(); int ...
algorithm-problem-leetcode-3181
3181. 执行操作可获得的最大总奖励 II(2688): bitset优化,利用BigInteger大数(bitset)的数值运算代替原本j的for循环
给你一个整数数组 rewardValues,长度为 n,代表奖励的值。
最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 :
从区间 [0, n - 1] 中选择一个 未标记 的下标 i。
如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardValues[i] 加到 x 上(即 x = x + rewardValues[i]),并 标记 下标 i。
以整数形式返回执行最优操作能够获得的 最大 总奖励。
示例 1:
**输入:**rewardValues = [1,1,3,3]
**输出:**4
解释:
依次标记下标 0 和 2,总奖励为 4,这是可获得的最大值。
示例 2:
**输入:**rewardValues = [1,6,4,3,2]
**输出:**11
解释:
依次标记下标 0、2 和 1。总奖励为 11,这是可获得的最大值。
提示:
1 <= re ...
algorithm-problem-leetcode-1981
1981. 最小化目标值与所选元素的差
给你一个大小为 m x n 的整数矩阵 mat 和一个整数 target 。
从矩阵的 每一行 中选择一个整数,你的目标是 最小化 所有选中元素之 和 与目标值 target 的 绝对差 。
返回 最小的绝对差 。
a 和 b 两数字的 绝对差 是 a - b 的绝对值。
示例 1:
1234567输入:mat = [[1,2,3],[4,5,6],[7,8,9]], target = 13输出:0解释:一种可能的最优选择方案是:- 第一行选出 1- 第二行选出 5- 第三行选出 7所选元素的和是 13 ,等于目标值,所以绝对差是 0 。
示例 2:
1234567输入:mat = [[1],[2],[3]], target = 100输出:94解释:唯一一种选择方案是:- 第一行选出 1- 第二行选出 2- 第三行选出 3所选元素的和是 6 ,绝对差是 94 。
示例 3:
1234输入:mat = [[1,2,9,8,7]], target = 6输出:1解释:最优的选择方案是选出第一行的 7 。绝对差是 1 。
提示:
m == m ...
algorithm-problem-leetcode-2585
2585. 获得分数的方法数(1910)
考试中有 n 种类型的题目。给你一个整数 target 和一个下标从 0 开始的二维整数数组 types ,其中 types[i] = [counti, marksi] 表示第 i 种类型的题目有 counti 道,每道题目对应 marksi 分。
返回你在考试中恰好得到 target 分的方法数。由于答案可能很大,结果需要对 10^9 +7 取余。
注意,同类型题目无法区分。
比如说,如果有 3 道同类型题目,那么解答第 1 和第 2 道题目与解答第 1 和第 3 道题目或者第 2 和第 3 道题目是相同的。
示例 1:
12345678910输入:target = 6, types = [[6,1],[3,2],[2,3]]输出:7解释:要获得 6 分,你可以选择以下七种方法之一:- 解决 6 道第 0 种类型的题目:1 + 1 + 1 + 1 + 1 + 1 = 6- 解决 4 道第 0 种类型的题目和 1 道第 1 种类型的题目:1 + 1 + 1 + 1 + 2 = 6- 解决 2 道第 0 种类型的题目和 2 道第 1 种类型的 ...