333 字
2 分钟
力扣2563:统计公平数对的数目
题目
给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平数对的数目 。
如果 (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 <= 105nums.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/ 部分信息可能已经过时