当前位置: 首页 > 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 <= nums.length <= 105^55
nums.length == n
-109^99 <= nums[i] <= 109^99
-109^99 <= lower <= upper <= 109^99

先对nums排序,然后可以用相向双指针找出两数之和小于等于upper的数对数,然后再用相向双指针找出两数之和小于lower的数对数,两者相减即可:

class Solution {
public:long long countFairPairs(vector<int>& nums, int lower, int upper) {sort(nums.begin(), nums.end());return getNum(nums, upper) - getNum(nums, lower - 1);}long long getNum(vector<int>& nums, int target) {long long ret = 0;int left = 0;int right = nums.size() - 1;while (left < right) {if (nums[left] + nums[right] > target) {--right;// 如果两指针指向的数之和<=target// 则[left + 1, right]之间的每个数都可以和left组成和<=target的数对} else {ret += right - left;++left;}}return ret;}
};

如果nums的长度为n,则此算法时间复杂度为O(nlogn),瓶颈在排序处,双指针循环的时间复杂度为O(n);空间复杂度为O(logn),主要是排序的栈开销。

http://www.lryc.cn/news/598317.html

相关文章:

  • AI时代,我的编程工作搭子
  • Windows 主机侧日志排查
  • CentOS7 安装 rust 1.82.0
  • 小模数齿轮的加工方法有哪些?
  • 医疗系统国产化实录:SQL Server国产替代,乙方保命指南
  • MySQL 表的操作
  • 【Haproxy】七层代理
  • 详解力扣高频SQL50题之1683. 无效的推文【入门】
  • MySQL深度理解-MySQL事务优化
  • SQL173 店铺901国庆期间的7日动销率和滞销率
  • 详解力扣高频SQL50题之197. 上升的温度【简单】
  • 【MySQL】MySQL 事务和锁详解
  • Redis--哨兵机制详解
  • day20 双向链表
  • 适配器模式——以springboot为例
  • RK3568笔记九十一:QT环境搭建
  • 【Java基础06】ArrayList
  • AudioLLM 开源项目了解学习
  • 构建企业级Docker日志驱动:将容器日志无缝发送到腾讯云CLS
  • 新mac电脑软件安装指南(前端开发用)
  • 2025年计算机网络与教育科学国际会议(ICCNES 2025)
  • IntelliJ IDEA中管理多版本Git子模块的完整指南
  • Elasticsearch安全审计日志设置与最佳实践
  • 从零构建:Jenkins与Kubernetes集成的完整指南
  • 福佑储能轴流风扇对储能安全的重要影响
  • 陪诊小程序系统开发:开启医疗陪护新时代
  • JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
  • 盲盒抽谷机小程序:二次元经济的“社交裂变引擎”如何引爆用户增长?
  • Apache 消息队列分布式架构与原理
  • 移动端自动化Appium框架