统计公平数对的数目

题目

6355. 统计公平数对的数目


给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平数对的数目

如果 (i, j) 数对满足以下情况,则认为它是一个 公平数对 :

  • 0 <= i < j < n,且
  • lower <= nums[i] + nums[j] <= upper

示例 1:

1
2
3
输入:nums = [0,1,7,4,4,5], lower = 3, upper = 6
输出:6
解释:共计 6 个公平数对:(0,3)、(0,4)、(0,5)、(1,3)、(1,4) 和 (1,5) 。

示例 2:

1
2
3
输入:nums = [1,7,9,2,5], lower = 11, upper = 11
输出:1
解释:只有单个公平数对:(2,3) 。

提示:

  • 1 <= nums.length <= 10^5
  • nums.length == n
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= lower <= upper <= 10^9

题解

方法一:

思路

排序后不会影响数对对数。
排序后二分即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
long long countFairPairs(vector<int>& nums, int lower, int upper) {
sort(nums.begin(), nums.end());
long long ans = 0;
for (int i=0; i<nums.size(); i++) {
ans += upper_bound(nums.begin(), nums.begin()+i, upper-nums[i])
- lower_bound(nums.begin(), nums.begin()+i, lower-nums[i]);
}
return ans;
}
};