2563、统计公平数对的数目
题目:
解答:
二分查找,闭区间。
先sort nums,让其有序。
遍历,对第i个数(i为下标,从0开始),寻找能令其满足题设条件的数x,lower<=nums[i]+x<=upper,再使用两次二分,查找满足nums[i]+x<lower的最小下标对应的数和nums[i]+x<=upper的最小下标对应的数。二者相减即获得nums[i]对应的。那么ans+=二者相减来更新。
二分查找过程中,left初始值从i+1开始即可。
class Solution {
public:long long countFairPairs(vector<int>& nums, int lower, int upper) {sort(nums.begin(),nums.end());int n = nums.size();if(n==1) return 0;long long ans = 0;for(int i = 0;i < n-1;i++){int left=i+1;int right=n-1;int mid = left+(right-left)/2;while(left<=right){if(nums[i]+nums[mid]<lower){left=mid+1;}else{right=mid-1;}mid = left+(right-left)/2;}int templeft = left;right=n-1;mid=left+(right-left)/2;while(left<=right){if(nums[i]+nums[mid]<=upper){left=mid+1;}else{right=mid-1;}mid=left+(right-left)/2;}ans+=left-templeft;}return ans;}
};
时间复杂度O(nlogn) 排序nlogn,遍历*查找也是n*logn
空间复杂度O(1)