【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-04-14
【Leetcode Daily】1534统计好三元组
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个数组,要求统计其中所有满足要求三元组的数量。该要求是,两两之差,满足题目的三个数字。 思路分享 首先就是暴力解法,O(n^3),不过陆爻齐在普通的暴力上做了一点点剪枝,但终究还是暴力。 想要比较好的完成本题,就需要学习前缀和,总体的思路是固定三元组中的两个,通过要求来求得剩下一个值的范围,将该范围在前缀和中搜寻,符合则找到合适的三元组。 https://leetcode.cn/problems/count-good-triplets/?envType=daily-question&envId=2025-04-14 代码解答(强烈建议自行解答后再看) 陆爻齐小改良的暴力解法 12345678910111213141516171819class Solution {public: int countGoodTriplets(vector<int>& arr, int a, int b, int c) { int size =...

2025-05-29
【Leetcode Daily】930和相同的二元子数组
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整数数组和目标整数 goal,求子数组和恰好为 goal 的子数组数量。 思路分享 这是“恰好型滑动窗口”,本质上就是两个越长越合法的窗口结果之差。 实现有两个方式,一个是单独把滑动窗口划分一个函数,调用两次,求结果之差;另一个是只设置一次滑动窗口,不过要同时维护两个左指针,计算结果是直接累计数值之差。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415161718192021// 恰好型滑动窗口class Solution {public: int numSubarraysWithSum(vector<int>& nums, int goal) { int left1 = 0, left2 = 0, ans = 0; int sum1 = 0, sum2 = 0; int goal1 = goal, goal2 = goal+1; for (int right =...

2025-05-31
【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个不降序数组和一个目标值 target,求数组中这个 target 值的下标区间,若无则返回{-1,-1}。 思路分享 https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/solutions/1980196/er-fen-cha-zhao-zong-shi-xie-bu-dui-yi-g-t9l9/ 二分查找的开始,虽然算法早就学过,但灵神的讲解十分透彻,十分值得学习。 下面的二分,都以如果中间量小于目标量左指针动,否则右指针动的情况,这样会求得二分值的最左处。 二分的灵魂在于循环不变量,即在循环中不变的东西,比如,左右指针的区间含义是闭区间,左闭右开,亦或开区间就很重要;还有循环结束后左右指针的位置也是,拿左闭右开举例,结束后,左右指针都处于target值最左处下标,因为左指针保持了 left-1 处必定小于 target,而右指针则保持了 right 处必定大于等于...

2025-05-31
【Leetcode Daily】35搜索插入位置
题目浅析 想查看原题可以点击题目链接。 简单地说,给一个升序的无重复元素数组和目标值,找到该值的下标,如果数组中无目标值,则返回应该插入的地方 思路分享 基本思路可看【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。 回到本题,要求这个“位置”,其实就是左指针,因为左指针确保 left-1 小于 target,循环到最后,left 本身一定是 target 应该所属的位置。 此外,c++ 的 ranges 库自带二分的低边界,可以写ranges::lower_bound(nums, target)来得到指向目标值左侧边界的迭代器,减去起始迭代器 begin() 就得到下标了。 代码解答(强烈建议自行解答后再看) 参考题解 1234567891011121314151617class Solution {public: int searchInsert(vector<int>& nums, int target) { int left = 0, right =...

2025-06-01
【Leetcode Daily】704二分查找
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个升序不重复的整型数组和一个目标值 target,找出 target 在数组中的下标,若 target 不存在,则返回 -1. 思路分享 看似与【Leetcode Daily】35搜索插入位置相似,但有一个需要特别注意的地方,那就是本题在搜索完成后,需要取左指针 left 对应的值来查看 target 是否存在。 这个就会要求 left 指针应当不超过数组边界,因为此前的基本思路中(【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置只能保证 left 指针的左侧所有下标元素均小于目标值,而不能保证 left 指针本身合法。 换句话,如果数组中所有元素小于目标值,那么 left 指针就会滑到 nums.size() 这个下标处,而下标的最大值是 nums.size()-1,就可能会不合法,需要在检测 target 是否存在前,先检测 left 是否合法。 代码解答(强烈建议自行解答后再看) 参考题解 12345678910111213141516class Solution...

2025-06-01
【Leetcode Daily】744寻找比目标字母大的最小字母
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个非递减顺序的字符数组,和一个字符 target,求数组中字典序大于 target 字符中最小的字符。 思路分享 解决三个问题就能做出本题,1. 二分怎么写;2. 怎么找二分目标值的后一个(前一个同理);3. 如何正确检查目标字符是否存在; 前两个问题在 【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置 中已说明,第三个问题在 【Leetcode Daily】704二分查找也有所说明。 代码解答(强烈建议自行解答后再看) 参考题解 1234567891011121314151617class Solution {public: char nextGreatestLetter(vector<char>& letters, char target) { int left = 0, right = letters.size(); while (left < right) { ...
公告
不定时更新,记录所学所想
系列文章