题目:leetcode2563题
解题思路
1.将原式移项变形,lower-nums[i]<=nums[j]<=upper-nums[i],那么当i确定的时候,就变成x<=nums[j]<=y的问题了
2.上述问题可以用c++库内置的二分查找函数来解决,找到x和y对标数组中的下标i1、i2,那么j的范围就确定了,即满足:在i1和i2之间 且 大于i
代码
class Solution {
public:
long long countFairPairs(vector<int>& nums, int lower, int upper) {
sort(nums.begin(),nums.end());
long ans=0;
for(int i=0;i<nums.size()-1;i++)
{
//lower-nums[i]<=nums[j]<=upper-nums[i]
int nl=lower-nums[i];
int nu=upper-nums[i];
int index1=lower_bound(nums.begin(),nums.end(),nl)-nums.begin();
int index2=upper_bound(nums.begin(),nums.end(),nu)-nums.begin();
//j的范围在[index1,index2),且j>i
if(i>=index1 && i<index2) ans+=index2-i-1;
else if(i<index1) ans+=index2-index1;
}
return ans;
}
};
注:本文从我的leetcode题解上直接搬运,整理下来便于复习