【Leetcode Daily】2389和有限的最长子序列
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:288|阅读时长:1分钟|浏览量:
题目浅析
想查看原题可以点击题目链接。
简单地说,就是求一个数组的每个值,与另一个数组子序列和的关系,在子序列和不超过这个值的前提下,求最长子序列的长度。
思路分享
前缀和+二分
为了使得子序列长度越长,要尽可能选取数值较小的元素。所以先排序,然后用前缀和得到各个子序列的和。
具体实现中,前缀和用 numeric 库的 partial_sum 实现,而二分就直接用 ranges 库的 upper_bound 函数,之所以不用 lower_bound 是因为本题要求“不超过”,而非小于。当然,用加一值的lower_cound也行。
代码解答(强烈建议自行解答后再看)
- 参考题解
1 | class Solution { |
文章作者: 陆爻齐-LuYaoQi
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuYaoQi's Blogs!
相关推荐

2025-07-27
【Leetcode Daily】1011在D天内送达包裹的能力
题目浅析 想查看原题可以点击题目链接。 思路分享 二分答案的基本思路可看【Leetcode Daily】1283使结果不超过阈值的最小除数。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415161718192021222324252627282930class Solution: def shipWithinDays(self, weights: List[int], days: int) -> int: # 先要定好二分答案的左右区间起始,注意这是开区间 left, right = max(weights)-1, 500*len(weights)+1 def check(weights: List[int], ship_load: int, days: int) -> bool: # 此处把负载过小的情况快速地排除,加速 if sum(weights) > ship_load*days: ...

2025-11-14
【Leetcode Daily】1094拼车
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个二维数组,其中的元素为长度 3 的一维数组,三个值分别是上车的人数,上车的下标,下车的下标,求整个过程中,车上的人数是否都小于 capacity。 思路分享 此前对于一段值的差值用前缀和处理,而前缀和的反面则是差分,求两个值的差值。所以差分记录的是值的变化,一个特点是,对于 a-b 区间的值加 10,相当于在差分数组上的 a 处加 10,b 处减 10. https://leetcode.cn/problems/car-pooling/solutions/2550264/suan-fa-xiao-ke-tang-chai-fen-shu-zu-fu-9d4ra/ 所以本题只要先求出整个数组的差分,再对差分做前缀和,过程中判断是否有值超过阈值即可。 代码解答(强烈建议自行解答后再看) 参考题解 12345678class Solution: def carPooling(self, trips: List[List[int]], capacity: int) -> bool: ...

2025-12-06
【Leetcode Daily】1109航班预订统计
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个航班预定表,内容分别是起始航班下标,终止航班下标,预订座位数组成的多个数据,求最终每个航班预定的座位数。 思路分享 越是做差分的题,越是发现,差分十分擅长处理增减的累计。拿此题来讲,只要通过差分记录各个航班的累计座位数,然后求前缀和即可。 https://leetcode.cn/problems/corporate-flight-bookings/solutions/968214/hang-ban-yu-ding-tong-ji-by-leetcode-sol-5pv8/ 代码解答(强烈建议自行解答后再看) 参考题解 1234567class Solution: def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]: rec = [0]*(n+2) for start, last, seats in bookings: rec[start] +=...

2025-06-05
【Leetcode Daily】1170比较字符串最小字母出现频次
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给两个字符串数组,看一个数组中各个字符串的最小字母频次,在另一个数组所有字符串的最小字母频次中,排第几。 思路分享 分别对两个数组做转换成最小字母频次的整型数组,然后让一个数组的各值在另一个数组做二分查找找到自己的位置即可。 二分的基本思想在 【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。 重点注意一个小问题,字典序的顺序与数字不同,字典序中 2 比 10 大,因为 2 大于 10 的第一位 1,所以 2 更大。正因如此,不能在 string 的数组上直接排序。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415161718192021222324252627282930class Solution {public: vector<int> numSmallerByFrequency(vector<string>& queries, vector<string>&...

2025-07-24
【Leetcode Daily】1283使结果不超过阈值的最小除数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个数组和一个阈值,现在找到一个尽可能大的数值 n,使得数组的每个值除 n 后之和小于阈值。 思路分享 二分的基本思路可看【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。 本题属于二分答案中的求最小系列,二分的思路是:既然求最小,那就是区间右侧满足条件,但左侧不满足,然后一点点逼近。 https://leetcode.cn/problems/find-the-smallest-divisor-given-a-threshold/solutions/2989469/mo-ban-er-fen-da-an-qiu-zui-xiao-pythonj-ukwe/ 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112class Solution: def smallestDivisor(self, nums: List[int], threshold: int) -> int: left, right = 0, max(nums) ...

2025-11-24
【Leetcode Daily】1314矩阵区域和
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个二维数组和一个数字 k,现在对于二维数组上的每个值,请求其为中心向周围延伸 k 个格子的正方形的区域和。 思路分享 本质上就是变形了的二维前缀和,只不过这次边界的需要自己计算和规范化,比如下面参考题解中写的 max,min 就是如此,对于超过了数组的值,尽量大或者尽量小就行。重点还是在于自己分辨清楚,边界的下标是否需要加一,由于初始化的矩阵左上多垫了一行和一列,所以计算右下坐标时也需要加一,而左上角本来需要减一,现在就不用变了。 https://leetcode.cn/problems/matrix-block-sum/solutions/101300/ju-zhen-qu-yu-he-by-leetcode-solution/ 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112class Solution: def matrixBlockSum(self, mat: List[List[int]], k: int) -> List[List[int]]: ...
公告
希望你我都能得偿所愿
PS:相对流水账的文章只能在归档找得到
系列文章
