2824. 统计和小于目标的下标对数目
给你一个下标从 0 开始长度为 n 的整数数组 nums
和一个整数 target
,请你返回满足 0 <= i < j < n
且 nums[i] + nums[j] < target
的下标对 (i, j)
的数目。
示例 1:
输入:nums = [-1,1,2,3,1], target = 2
输出:3
解释:总共有 3 个下标对满足题目描述:
- (0, 1) ,0 < 1 且 nums[0] + nums[1] = 0 < target
- (0, 2) ,0 < 2 且 nums[0] + nums[2] = 1 < target
- (0, 4) ,0 < 4 且 nums[0] + nums[4] = 0 < target
注意 (0, 3) 不计入答案因为 nums[0] + nums[3] 不是严格小于 target 。
示例 2:
输入:nums = [-6,2,5,-2,-7,-1,3], target = -2
输出:10
解释:总共有 10 个下标对满足题目描述:
- (0, 1) ,0 < 1 且 nums[0] + nums[1] = -4 < target
- (0, 3) ,0 < 3 且 nums[0] + nums[3] = -8 < target
- (0, 4) ,0 < 4 且 nums[0] + nums[4] = -13 < target
- (0, 5) ,0 < 5 且 nums[0] + nums[5] = -7 < target
- (0, 6) ,0 < 6 且 nums[0] + nums[6] = -3 < target
- (1, 4) ,1 < 4 且 nums[1] + nums[4] = -5 < target
- (3, 4) ,3 < 4 且 nums[3] + nums[4] = -9 < target
- (3, 5) ,3 < 5 且 nums[3] + nums[5] = -3 < target
- (4, 5) ,4 < 5 且 nums[4] + nums[5] = -8 < target
- (4, 6) ,4 < 6 且 nums[4] + nums[6] = -4 < target
提示:
1 <= nums.length == n <= 50
-50 <= nums[i], target <= 50
方法 相向双指针
- 同1_相向双指针_leetcode_15_2使用相向双指针需要确保数据有序的关系,所以首先需要对数组按升序重新排列。
- 如果此时在区间端点值 n u m s l nums_l numsl + n u m s r nums_r numsr < target,说明 n u m s l nums_l numsl 与 在区间 [ l + 1 , r ] [l + 1,r] [l+1,r]的值进行组合都小于target,计算数量后,左指针向右边移动。
- 如果此时在区间端点值 n u m s l nums_l numsl + n u m s r nums_r numsr < target,说明枚举的右指针对应值过大,右端点应该向左移动。
//C
int cmp(const void * a,const void *b){
return *(int*)a - *(int*)b;
}
int countPairs(int* nums, int numsSize, int target) {
qsort(nums,numsSize,sizeof(int),cmp);
int l = 0;
int r = numsSize - 1;
int cnt = 0;
while(l < r){
if(nums[l] + nums[r] < target){
cnt += r - l ;
l++;
}
else r--;
}
return cnt;
}
// C++
class Solution {
public:
int countPairs(vector<int>& nums, int target) {
int l = 0;
int r = nums.size() - 1;
int cnt = 0;
sort(nums.begin(),nums.end());
while(l < r){
if(nums[l] + nums[r] >= target) r--;
else{
cnt += r - l;
l++;
}
}
return cnt;
}
};
#python
class Solution:
def countPairs(self, nums: List[int], target: int) -> int:
nums.sort()
l,r =0,len(nums)-1
cnt = 0
while l < r:
sum = nums[l]+nums[r]
if sum >= target:
r-=1
else:
cnt += r-l
l+=1
return cnt
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
- 空间复杂度: O ( l o g n ) O(logn) O(logn)