【Leetcode Daily】2070每一个查询的最大美丽值
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:366|阅读时长:1分钟|浏览量:
题目浅析
想查看原题可以点击题目链接。
简单地说,就是给一个二位整数数组来代表一个商品的价格和美丽值,然后根据一系列价格,查询不高于该数值能得到的最大美丽值。
思路分享
二分的基本思路可看【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。
本题有好几个思路,下面的参考题解选取采用预处理 item 和 二分 的方法。
重点是预处理,将商品们按价格升序排列后,再只保留相同价格中的最大美丽值,这样就方便了后续的二分,同时也减少了复杂性。
至于二分,需要牢记的是二分取左右的含义,本题二分的是目标值加一的取右,所以如果这个值取到了 0,说明目标不存在,也就是不符合条件了。
代码解答(强烈建议自行解答后再看)
- 参考题解
1 | class Solution: |
文章作者: 陆爻齐-LuYaoQi
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuYaoQi's Blogs!
相关推荐

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) { ...

2025-06-02
【Leetcode Daily】2300咒语和药水的成功对数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给两个数组和一个目标值,求一个数组中的每个值,与另一数组每个值之积大于目标值的个数。 思路分享 先要对数组做排序,这要才能二分查找,然后对一个数组的每个值做一次二分查找,就确认了个数,毕竟是有序的,右侧之积都不满足的情况下,左侧之积必然不满足。 二分的基本思路可以看 【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。 不过,灵神的题解通过引入上取整和下取整的转换简化了不等式的比较,但暂且不甚理解,先放这里,说不定之后突然明白了呢。 https://leetcode.cn/problems/successful-pairs-of-spells-and-potions/solutions/1595712/by-endlesscheng-1kbp/ 代码解答(强烈建议自行解答后再看) 参考题解 12345678910111213141516171819202122class Solution {public: vector<int>...

2025-06-02
【Leetcode Daily】2529正整数和负整数的最大计数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整数数组,求其中负整数和正整数数目中的最大值,0 不属于两者。 思路分享 本题暴力枚举也能 ac,下面就说说二分的写法。 就是解决两个问题,一是如何二分查找,二是如何利用二分找一个目标值的左部和右部。都在【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置有所回答。 代码解答(强烈建议自行解答后再看) 参考题解 12345678910111213141516171819202122class Solution {public: int lowerBound(vector<int>& nums, int target) { int left = 0, right = nums.size(); while (left < right) { int mid = left + (right-left)/2; if (nums[mid] <...
公告
不定时更新,记录所学所想
系列文章