333 字
2 分钟
力扣2563:统计公平数对的数目

题目#

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

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

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

示例 1:

输入: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:

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

提示:

  • 1 <= nums.length <= 105
  • nums.length == n
  • -109 <= nums[i] <= 109
  • -109 <= lower <= upper <= 109

思路#

个人感觉好难, 首先将原式变为lower - num[j]<= num[i] <= upper - num[j], 然后三指针, 一指针代表j, 另外两指针代表i的范围左闭右开(能很好处理00情况)。

题解#

func countFairPairs(nums []int, lower int, upper int) (result int64) {
sort.Ints(nums)
left, right := len(nums), len(nums)
for k, v := range nums { //k就是j
for right > 0 && nums[right - 1] > upper - v { //停在符合条上件的右边
right--
}
for left > 0 && nums[left - 1] >= lower - v { //停在符合条件上
left--
}
result += int64(min(right, k) - min(left, k)) //从本质上来讲left和right都是i,表示i的取值范围, 因此必须满足i < j
}
return
}
力扣2563:统计公平数对的数目
https://mizuki.mysqil.com/posts/力扣52/l力扣52/
作者
猫梦
发布于
2025-12-18
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00