当前位置: 首页 > news >正文

LeetCode 分类刷题:2563. 统计公平数对的数目

题目

给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平数对的数目 。

如果 (i, j) 数对满足以下情况,则认为它是一个 公平数对 :

  • 0 <= i < j < n,且
  • lower <= nums[i] + nums[j] <= upper

示例 1:

输入:nums = [0,1,7,4,4,5], lower = 3, upper = 6
输出:6
解释:共计 6 个公平数对:(0,3)、(0,4)、(0,5)、(1,3)、(1,4) 和 (1,5) 。

示例 2:

输入:nums = [1,7,9,2,5], lower = 11, upper = 11
输出:1
解释:只有单个公平数对:(2,3) 。

解析

来自豆包的解释

排序为何不改变答案?—— 从 “数对本质” 分析

排序的本质是重新排列数组元素的位置,但不会改变以下两个统计公平数对的核心要素:

1. 所有可能的 “元素对组合” 不变

公平数对的数值约束仅依赖 “两个元素的和”,而非它们的原始位置。例如原始数组[0,1,7,4,4,5]中,数对(0,3)对应元素0+4=4(满足 3≤4≤6),排序后数组变为[0,1,4,4,5,7],这两个元素依然存在,只是位置变为(0,2),但 “0 和 4 的组合” 及 “和为 4” 的事实未变。
排序后,我们依然能找到所有 “数值和在 [lower, upper] 区间内” 的元素对 —— 只是这些元素对的位置索引发生了变化,但 “存在多少个这样的对” 不会减少或增加。

2. 排序后仍能保证 “i < j” 的位置约束(且不重复统计)

题目要求i < j,本质是 “每个数对只统计一次”(避免(i,j)和(j,i)被重复计算)。排序后,我们依然可以通过 “固定 j,找左侧 i < j 的元素” 或 “双指针 / 二分法遍历有序数组” 来满足i < j的约束,且不会遗漏或重复统计。
例如排序后的数组[0,1,4,4,5,7],统计时只需确保 “每次找的元素都在当前元素的左侧”(i < j),就能和原始数组的统计逻辑保持一致 —— 最终得到的 “符合条件的数对数量” 与原始数组完全相同。

由于排序不影响答案,可以先(从小到大)排序,这样可以二分查找。

nums 是 [1,2] 还是 [2,1],算出来的答案都是一样的,因为加法满足交换律 a+b=b+a。

排序后,枚举右边的 nums[j],那么左边的 nums[i] 需要满足 0≤i<j 以及lower−nums[j]≤nums[i]≤upper−nums[j]
计算 ≤upper−nums[j] 的元素个数,减去 <lower−nums[j] 的元素个数,即为满足上式的元素个数。(联想一下前缀和)

由于 nums 是有序的,我们可以在 [0,j−1] 中二分查找,

  • 找到 >upper−nums[j] 的第一个数,设其下标为 r,那么下标在 [0,r−1] 中的数都是 ≤upper−nums[j] 的,这有 r 个。如果 [0,j−1] 中没有找到这样的数,那么二分结果为 j。这意味着 [0,j−1] 中的数都是 ≤upper−nums[j] 的,这有 j 个。
  • 找到 ≥lower−nums[j] 的第一个数,设其下标为 l,那么下标在 [0,l−1] 中的数都是 <lower−nums[j] 的,这有 l 个。如果 [0,j−1] 中没有找到这样的数,那么二分结果为 j。这意味着 [0,j−1] 中的数都是 <lower−nums[j] 的,这有 j 个。
  • 满足 lower−nums[j]≤nums[i]≤upper−nums[j] 的 nums[i] 的个数为 r−l,加入答案。

作者:灵茶山艾府
链接:https://leetcode.cn/problems/count-the-number-of-fair-pairs/solutions/2107079/er-fen-cha-zhao-de-ling-huo-yun-yong-by-wplbj/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

答案

class Solution:def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:nums.sort()ans = 0for j, x in enumerate(nums):# 注意要在 [0, j-1] 中二分,因为题目要求两个下标 i < jr = bisect_right(nums, upper - x, 0, j)l = bisect_left(nums, lower - x, 0, j)ans += r - l  return ans# 作者:灵茶山艾府
# 链接:https://leetcode.cn/problems/count-the-number-of-fair-pairs/solutions/2107079/er-fen-cha-zhao-de-ling-huo-yun-yong-by-wplbj/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复杂度分析

时间复杂度:O(nlogn),其中 n 为 nums 的长度。

空间复杂度:O(1)。忽略排序的栈开销。


文章转载自:

http://pePSYlmb.tbLbr.cn
http://Ny2JgAqu.tbLbr.cn
http://YfrUvEi1.tbLbr.cn
http://KD9tE7To.tbLbr.cn
http://yiyw8ImJ.tbLbr.cn
http://TAQwpR5a.tbLbr.cn
http://N5jgmACB.tbLbr.cn
http://xwAi6yPh.tbLbr.cn
http://sieOtJaT.tbLbr.cn
http://iBdcPtQY.tbLbr.cn
http://5dUoIQvn.tbLbr.cn
http://KBXk0cu9.tbLbr.cn
http://yP3ThjaR.tbLbr.cn
http://SIEYtyPc.tbLbr.cn
http://xu2NfZNl.tbLbr.cn
http://JSYIHfGA.tbLbr.cn
http://c6uXpru2.tbLbr.cn
http://fn3YpOCR.tbLbr.cn
http://fKiaccDb.tbLbr.cn
http://UEqifLeN.tbLbr.cn
http://ElISppEC.tbLbr.cn
http://VduuWzrU.tbLbr.cn
http://bWjGUOFo.tbLbr.cn
http://3ibA5TfO.tbLbr.cn
http://c6roxd1H.tbLbr.cn
http://I9FKz78I.tbLbr.cn
http://UqlYnita.tbLbr.cn
http://yRLKAIde.tbLbr.cn
http://kxXKCkrj.tbLbr.cn
http://65rUiU5L.tbLbr.cn
http://www.dtcms.com/a/373018.html

相关文章:

  • [前端]1.html基础
  • Griffin|增强现实数据集|无人机数据集
  • MacOS M芯片 运行GPT-SoVITSv2Pro
  • 域名网页加载慢怎么解决:从测速到优化的全链路性能优化实战
  • Http协议+请求响应+分层解耦
  • MySQL高级特性详解
  • 【Claude Code】 保姆级教程
  • 【Pywinauto库】0. Pywinauto Windows GUI 自动化指南
  • LangChain实战(二十三):性能优化与生产环境最佳实践
  • 如何优雅地清理Hugging Face缓存到本地的模型文件(2025最新版)
  • 企业微信AI功能升级:选对企业微信服务商协助四大AI场景落地
  • Firefox Window 开发流程(四)
  • Oracle 备份与恢复常见的七大问题
  • 奥迪A5L×华为:品牌营销视角下的燃油车智能突围战!
  • LAMPSecurity: CTF5靶场渗透
  • 【Java实战㉟】Spring Boot与MyBatis:数据库交互的进阶之旅
  • 金融量化指标--3Beta 贝塔
  • leetcode10(跳跃游戏 II)
  • <数据集>无人机航拍人员搜救识别数据集<目标检测>
  • [每周一更]-(第159期):Go 工程师视角:容器化技术(Docker/Kubernetes)与CI/CD流程的应用场景
  • 低代码拖拽实现与bpmn-js详解
  • 六、Docker 核心技术:Dockerfile 指令详解
  • scp 网间拷贝
  • 20250908_开启10.1.3.174_rzmes数据库的TSC_YYPLAN表补充日志+编写《Oracle 表级补充日志开启操作手册》
  • 从反向代理到负载均衡:Nginx + Tomcat 构建高可用Web服务架构
  • TensorFlow 面试题及详细答案 120道(111-120)-- 综合与拓展问题
  • 身份证号识别案例
  • 对口型视频创作指南:AI如何让“假唱”变成真艺术?
  • [免费]基于Python的协同过滤电影推荐系统(Django+Vue+sqlite+爬虫)【论文+源码+SQL脚本】
  • Spark RDD转DataFrame的三种方式