以下有三种解法,分别是直接双重循环、排序加二分和双指针
class Solution {
public:
int countPairs(vector<int>& nums, int target) {
int i,j,count=0;
for(i=0;i<nums.size();i++)
{
for(j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]<target)count++;
}
}
return count;
}
};
class Solution {
public:
int countPairs(vector<int>& nums, int target) {
int i,j,count=0;
sort(nums.begin(),nums.end());
for(i=0;i<nums.size();i++)
{
int j=lower_bound(nums.begin(),nums.begin()+i,target-nums[i])-nums.begin();
count+=j;
}
return count;
}
};
class Solution {
public:
int countPairs(vector<int>& nums, int target) {
int n=nums.size();
sort(nums.begin(), nums.end());
// 双指针 一个指针指向当前最小元素,一个指针指向当前最大匹配元素,且无需重置
int ans=0;
int i=0, j=n-1;
while(i<j){
if(nums[i]+nums[j]>=target){
j--;
}else{
ans+=j-i;
i++;
}
}
return ans;
}
};