Bootstrap

1_相向双指针_leetcode_2824_3

2824. 统计和小于目标的下标对数目

给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target ,请你返回满足 0 <= i < j < nnums[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)
;