algorithm-problem-leetcode-122
122. 买卖股票的最佳时机 II
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
示例 1:
12345输入:prices = [7,1,5,3,6,4]输出:7解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。最大总利润为 4 + 3 = 7 。
示例 2:
1234输入:prices = [1,2,3,4,5]输出:4解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。最大总利润为 4 。
示例 3:
123输入:prices = [7,6,4,3,1]输出: ...
algorithm-problem-leetcode-121
121. 买卖股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
1234输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
123输入:prices = [7,6,4,3,1]输出:0解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
1 <= prices.length <= 10^5
0 <= prices[i] <= 10^4
12345678910class Solution { public int maxProfi ...
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
1234567891011121314151617181920212223242526class Solution { char s[]; int memo[][]; // 记忆化 public int countSpecialNumbers(int n) { s = String.val ...