algorithm-problem-leetcode-2088
2008. 出租车的最大盈利(1872)
你驾驶出租车行驶在一条有 n 个地点的路上。这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n ,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。
乘客信息用一个下标从 0 开始的二维数组 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客需要从地点 starti 前往 endi ,愿意支付 tipi 元的小费。
每一位 你选择接单的乘客 i ,你可以 盈利 endi - starti + tipi 元。你同时 最多 只能接一个订单。
给你 n 和 rides ,请你返回在最优接单方案下,你能盈利 最多 多少元。
**注意:**你可以在一个地点放下一位乘客,并在同一个地点接上另一位乘客。
示例 1:
123输入:n = 5, rides = [[2,5,4],[1,5,1]]输出:7解释:我们可以接乘客 0 的订单,获得 5 - 2 + 4 = 7 元。
示例 2:
1234567输入:n = 20, rides = [[1,6,1],[3,10,2],[1 ...
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 ...