【Leetcode Daily】2563统计公平数对的数目
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:323|阅读时长:1分钟|浏览量:
题目浅析
想查看原题可以点击题目链接。
简单地说,题目规定了一种公平数对,也就是两个数字之和在一个数值区间中的情况,要求一个数组中有多少个公平数对。
思路分享
二分的基本思路可看【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。
两数之和,马上就会想到枚举相关的技巧,通过简单变式就能把 l < a + b < r 的条件转化为 l-a < b < r-a,然后只要不断地枚举 a,找出 b 的范围并记录即可。
由于本题的数对与位置无关,故可以先排序处理。排序后,就可以用二分查找快速定位要查找的数值(b 的区间)。
本题学到了 bisect 的后两个参数的作用,即查找下标的区间。
代码解答(强烈建议自行解答后再看)
- 参考题解
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-06-12
【Leetcode Daily】1128等价多米诺骨牌对的数量
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个元素为长度2的vector的vector,找出其中所有元素 vector 相同的对数,其中相同指的是两个 vector,各个元素相同,或者第一个元素与另一个的第二个相同,剩余两个相同。 思路分享 用二维数组当哈希表记录即可,可以选择对一个数对维护两个哈希表位,但哈希表的维护消耗资源其实不小,所以直接调整数对统一数对中的大小相对顺序,就只要用一个位置对应一个数对。比如把(2,1)转化为(1,2)来看。 C++中,可以通过 minmax 构建一个第一个元素小于第二个元素的 pair。 https://leetcode.cn/problems/number-of-equivalent-domino-pairs/solutions/3661647/mei-ju-you-wei-hu-zuo-pythonjavaccgojsru-me3c/ O(n) 枚举的基本思想可以看 【Leetcode Daily】1两数之和。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112class...

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-06-13
【Leetcode Daily】121买卖股票的最佳时机-枚举
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整型数组,说这里的每个数字都是股票加个,你可以在任意时期购买股票并在后面卖出一次,请给出最大利润,若无利润则返回 0. 思路分享 本题可以用动态规划或枚举的方法解决,这里介绍枚举的方法。 可以遍历数字,从左到右,视为找最大值,同时引入一变量记录目前左侧的最小值,不断计算当前最小值与最右值的差的最大值,就能得到答案。 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/solutions/2464650/mei-ju-mai-chu-jie-ge-wei-hu-mai-ru-de-z-02ud/ 无需哈希表,毕竟用记录最小值即可。基础的枚举思路可看 【Leetcode Daily】1两数之和。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112class Solution {public: int maxProfit(vector<int>& prices) {...

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-06-03
【Leetcode Daily】1385两个数组间的距离值
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给两个数组,求一个数组在另一数组不满足与其中一个值的一定区间内的元素数量。 思路分享 如何实现二分可看【Leetcode Daily】34在排序数组中查找元素的第一个和最后一个位置。 重点在于深刻理解二分的含义,比如上面样例的二分返回的下标的含义,其实是第一个大于目标值的下标,在这个基础上,如何该值同时已经超过目标值的区间,就说明满足题意。 https://leetcode.cn/problems/find-the-distance-value-between-two-arrays/solutions/3010185/liang-chong-fang-fa-er-fen-cha-zhao-san-15u9b/ 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415161718192021222324252627class Solution {public: int lowerBound(vector<int> &nums, int...
公告
希望你我都能得偿所愿
PS:相对流水账的文章只能在归档找得到
系列文章
