LeetCode 分类刷题: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

解析

排序后:

初始化左右指针 left=0, right=n−1。
如果 numsleft+numsright<target ,由于数组是有序的,numsleft 与下标 i 在区间 left+1,right 中的任何 numsi 相加,都是 <target 的,因此直接找到了 right−left 个合法数对,加到答案中,然后将 left 加一
如果 numsleft+numsright≥target ,由于数组是有序的,numsright 与下标 i 在区间 left,right−1 中的任何 numsi 相加,都是 ≥target 的,因此后面无需考虑 numsright,将 right 减一
重复 上述过程直到 left≥right为止。

作者:灵茶山艾府

链接:https://leetcode.cn/problems/count-pairs-whose-sum-is-less-than-target/solutions/2396216/onlogn-pai-xu-shuang-zhi-zhen-by-endless-qk40/

来源:力扣(LeetCode)

答案

javascript 复制代码
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var countPairs = function(nums, target) {
    nums.sort((a, b) => a - b);
    let ans = 0, left = 0, right = nums.length - 1;
    while(left < right) {
        if(nums[left] + nums[right] < target) {
            ans += right - left;
            left++;
        } else {
            right--;
        }
    }
    return ans;
};

复杂度分析

时间复杂度:O(nlogn),其中 n 为 nums 的长度。瓶颈在排序上。

空间复杂度:O(1)。不计入排序的栈开销,仅用到若干额外变量。

相关推荐
程序喵大人2 小时前
【C++进阶】STL算法与函数对象 - 09 函数对象保存状态并复用规则
开发语言·c++·算法·stl·函数对象
致Great6 小时前
DeepSeek Harness插件开发实战教程:我让它自己写了一个 arXiv 搜索插件
算法
起床学FPGA10 小时前
AI回答问题之后,会自动跳到最下面的问题
开发语言·javascript·ecmascript
罗西的思考11 小时前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习
民乐团扒谱机11 小时前
【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比
大数据·人工智能·算法·机器学习·数学建模·matlab·组合优化
Nil20812 小时前
leetcode 160相交链表
算法·leetcode·链表
迷途之人不知返13 小时前
算法系列2:滑动窗口
算法
Herbert_hwt13 小时前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
默_笙13 小时前
❗ 点击计数按钮,为什么"峨眉队"也跟着重新渲染?React.memo 说:我记住了
前端·javascript
名字还没想好☜14 小时前
Next.js 用 Server Components 直连数据库:去掉 API 层的边界,和三条别踩的安全红线
前端·javascript·数据库·安全·react·next.js