【Leetcode Daily】2080区域内查询数字的频率
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:477|阅读时长:1分钟|浏览量:
题目浅析
想查看原题可以点击题目链接。
简单地说,就是给一个数组,要求建立一个数据结构,使得输入一个区间和一个目标值,可以返回目标值在区间内的出现频率。
思路分享
用二分可以加速有序数组的查找效率,所以陆爻齐开始的思路是,截取区间数组,排序,然后二分查找上界与下界之差。然后在最后的几个样例超时了。
这时就显现灵神题解的强大了,如何快速查找一个区间内有几个这个数字呢?只要先把各个数字的下标用 map 记录即可,每个数字对应一串下标,由于初始化时就是从前往后,所以不用排序。
记录下标后,不是查询时会给区间嘛,用区间的上下界,在对应目标值的下标数组中,二分查找自己的位置,然后做差就可以得到这个区间内数字的频率了,毕竟此时这两位置之间就是之前数字的下标。
这里补充一下,ranges 库的 upper 和 lower_bound 分别可以看作,找第一个大于 val 的下标和找第一个大于等于 val 的下标。
代码解答(强烈建议自行解答后再看)
- 参考题解
1 | class RangeFreqQuery { |
文章作者: 陆爻齐-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] <...
公告
希望你我都能得偿所愿
PS:相对流水账的文章只能在归档找得到
系列文章
