LeetCode 2563.统计公平数对的数目:排序 + 二分查找

【LetMeFly】2563.统计公平数对的数目:排序 + 二分查找

力扣题目链接:https://leetcode.cn/problems/count-the-number-of-fair-pairs/

给你一个下标从 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
  • nums.length == n
  • -109 <= nums[i] <= 109
  • -109 <= lower <= upper <= 109

解题方法:排序 + 二分查找

要找的是值在一定范围内的 n u m s [ i ] + n u m s [ j ] nums[i] + nums[j] nums[i]+nums[j],且加法满足交换律( a + b = b + a a+b=b+a a+b=b+a),所以查找结果和元素顺序无关。

所以只需要遍历 n u m s nums nums的下标作为 i i i,并在 i + 1 i+1 i+1到数组末尾的范围内查找 j j j的范围,最终累加到答案中即可。

如何确定 j j j的范围? u p p e r _ b o u n d ( u p p e r − i ) − l o w e r _ b o u n d ( l o w e r − i ) upper\_bound(upper - i) - lower\_bound(lower - i) upper_bound(upperi)lower_bound(loweri) l o w e r _ b o u n d ( u p p e r − i + 1 ) − l o w e r b o u n d ( l o w e r − i ) lower\_bound(upper - i + 1) - lower_bound(lower - i) lower_bound(upperi+1)lowerbound(loweri)均可。

其中 l o w e r b o u n d ( t ) lower_bound(t) lowerbound(t)是非递减数组中第一个插入 t t t后数组仍非递减的下标, u p p e r b o u n d ( t ) upper_bound(t) upperbound(t)是非递减数组中最后一个插入 t t t后数组仍非递减的下标。

  • 时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),其中 n = l e n ( n u m s ) n=len(nums) n=len(nums)
  • 空间复杂度 O ( log ⁡ n ) O(\log n) O(logn)

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-04-19 15:51:42* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-04-19 16:12:44*/
/*
l: first j 满足 nums[j] + nums[i] >= lower | nums[j] >= lower - nums[i]
r: last  j 满足 nums[j] + nums[i] <= upper | nums[j] <= upper - nums[i]l: lower_bound(lower - nums[i])
r: upper_bound(upper - nums[i])
*/
typedef long long ll;
class Solution {
public:long long countFairPairs(vector<int>& nums, int lower, int upper) {sort(nums.begin(), nums.end());ll ans = 0;for (int i = 0; i < nums.size(); i++) {ans += upper_bound(nums.begin() + i + 1, nums.end(), upper - nums[i]) - lower_bound(nums.begin() + i + 1, nums.end(), lower - nums[i]);// cout << i << ": " << i << "[" << lower_bound(nums.begin() + i + 1, nums.end(), lower - nums[i]) - nums.begin() << ", " << upper_bound(nums.begin() + i + 1, nums.end(), upper - nums[i]) - nums.begin() << ')' << endl;}return ans;}
};
Python
'''
Author: LetMeFly
Date: 2025-04-19 16:13:37
LastEditors: LetMeFly.xyz
LastEditTime: 2025-04-19 16:23:38
'''
from typing import List
from bisect import bisect_left, bisect_rightclass Solution:def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:nums.sort()return sum(bisect_right(nums, upper - nums[i], i + 1) - bisect_left(nums, lower - nums[i], i + 1) for i in range(len(nums)))
Java
/** @Author: LetMeFly* @Date: 2025-04-19 16:24:08* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-04-19 16:37:36*/
import java.util.Arrays;class Solution {private int search(int[] nums, int x, int l) {  // search [l, len(nums)) 范围内第一个大于等于x的下标int r = nums.length;while (l < r) {int mid = (l + r) >> 1;if (nums[mid] >= x) {r = mid;} else {l = mid + 1;}}return l;}public long countFairPairs(int[] nums, int lower, int upper) {Arrays.sort(nums);long ans = 0;for (int i = 0; i < nums.length; i++) {ans += search(nums, upper - nums[i] + 1, i + 1) - search(nums, lower - nums[i], i + 1);}return ans;}
}
Go
/** @Author: LetMeFly* @Date: 2025-04-19 16:24:24* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-04-19 16:43:06*/
package main
import ("sort"
)func countFairPairs(nums []int, lower int, upper int) (ans int64) {sort.Ints(nums)for i, v := range nums {l := sort.Search(len(nums), func(x int) bool {return x > i && nums[x] >= lower - v})r := sort.Search(len(nums), func(x int) bool {return x > i && nums[x] >= upper - v + 1})ans += int64(r - l)}return
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF1016赛后总结

文章目录 前言T1:Ideal GeneratorT2&#xff1a;Expensive NumberT3:Simple RepetitionT4&#xff1a;Skibidi TableT5:Min Max MEXT6:Hackers and Neural NetworksT7:Shorten the Array 前言 由于最近在半期考试&#xff0c;更新稍微晚了一点&#xff0c;还望大家见谅 &#…

HFSS3(limy)——建模学习记录

前言——笔者使用的是21版HFSS 1.基本模型 为什么没有环形的天线 2.创建基本模型方法 常用&#xff1a;先粗略建好模型再编辑输入准确坐标和大小尺寸&#xff08;这里长方体起始点是左上角下方的点&#xff0c;也就是说要输入模型起点相对于坐标原点的位置尺寸就可以确定具体…

API网关的作用?企业如何应用API网关?

一、API网关的用处 API网关我的分析中会用到以下三种场景。 1、Open API 企业需要将自身数据、能力等作为开发平台向外开放&#xff0c;通常会以rest的方式向外提供。最好的例子就是淘宝开放平台、腾讯公司的QQ开发平台、微信开放平台。 Open API开放平台必然涉及到客户应用…

国网B接口协议图像数据上报通知接口流程详解以及上报失败原因(电网B接口)

文章目录 一、B接口协议图像数据上报通知接口介绍B.13.1 接口描述B.13.2 接口流程B.13.3 接口参数B.13.3.1 SIP头字段B.13.3.2 SIP响应码B.13.3.3 XML Schema参数定义 B.13.4 消息示例B.13.4.1 图像数据上报请求B.13.4.2 图像数据上报响应 二、B接口图像数据上报通知失败常见问…

springAi---智能客服

首先被取代的是客服类&#xff0c;智能客服机器人都能够高效地完成任务。 spring Ai 大模型应用相关开发demo&#xff0c;智能客服系统&#xff1b; 在需求分析阶段&#xff0c;把功能属于传统Java处理的和ai的功能进行分离 梳理为流程图如下&#xff1a; 在大模型中&#…

Java面试(2025)——基础

Java语言有哪些特点&#xff1f; Java语言具有多个显著特点&#xff0c;使其在编程领域广受欢迎。首先&#xff0c;Java的跨平台性非常强&#xff0c;通过Java虚拟机&#xff08;JVM&#xff09;实现“编写一次&#xff0c;随处运行”&#xff0c;使得开发者能够在不同操作系统…

Linux压缩与解压命令完全指南:tar.gz、zip等格式详解

Linux压缩与解压命令完全指南&#xff1a;tar.gz、zip等格式详解 在Linux系统中&#xff0c;文件压缩和解压是日常操作中不可或缺的一部分。本文将全面介绍Linux下常用的压缩和解压命令&#xff0c;包括tar.gz、tar、zip等格式的区别和使用方法&#xff0c;帮助你高效管理文件…

C++ STL 环形队列模拟实现

C STL 环形队列模拟实现 下面是一个使用C STL实现的环形队列&#xff08;Circular Queue&#xff09;的完整示例&#xff1a; #include <iostream> #include <vector> #include <stdexcept>template <typename T> class CircularQueue { private:std…

部署rocketmq集群

容器化部署RocketMQ5.3.1集群 背景: 生产环境单机的MQ不具有高可用,所以我们应该部署成集群模式,这里给大家部署一个双主双从异步复制的Broker集群 一、安装docker yum install -y docker systemctl enable docker --now # 单机部署参考: https://www.cnblogs.com/hsyw/p/1…

mysql的函数(第一期)

一、字符串函数​​ 处理文本数据&#xff0c;常用函数&#xff1a; ​​CONCAT(str1, str2, ...)​​ ​​作用​​&#xff1a;拼接字符串。​​示例​​&#xff1a;SELECT CONCAT(Hello, , World); → Hello World​​注意​​&#xff1a;若任一参数为 NULL&#xff0c;…

Linux下的网络管理

注意&#xff1a;本文使用的Linux系统版本为Red Hat Enterprise Linux 9 (RHEL 9)。 在RHEL9上&#xff0c;使用NM&#xff08;NetworkManager&#xff09;进行网络配置&#xff0c;ifcfg &#xff08;也称为 文件&#xff09;将不再是网络配置文件的主存储。虽然 ifcfg 样式仍…

游戏引擎学习第233天

原地归并排序地方很蒙圈 game_render_group.cpp&#xff1a;注意当前的SortEntries函数是O(n^2)&#xff0c;并引入一个提前退出的条件 其实我们不太讨论这些话题&#xff0c;因为我并没有深入研究过计算机科学&#xff0c;所以我也没有太多内容可以分享。但希望在过去几天里…

从《周游记3》演绎歌剧版《菊花台》,周杰伦婚礼曲目意大利文版惊喜亮相

今天&#xff08;4月19日&#xff09;22:00&#xff0c;由魔胴西西里咖啡冠名的户外实境互动综艺《周游记3》第四期即将播出。本期节目中&#xff0c;“J式之旅”发起人周杰伦和林暐恒、杜国璋、陈冠霖、陈冠廷&#xff0c;将继续意大利之旅&#xff0c;从那不勒斯的百年老店到…

Linux系统编程 day6 进程间通信mmap

父子共享的信息&#xff1a;文件描述符&#xff0c;mmap建立的共享映射区&#xff08;MAP_SHARED&#xff09; mmap父子间进程通信 var的时候 &#xff1a;读时共享&#xff0c;写时复制 父进程先创建映射区&#xff0c;指定共享MAP_SHARED权限 &#xff0c; fork创建子进程…

opencv--图像处理

图像处理技术 图像处理技术是利用计算机对图像进行计算,分析和处理的技术,包括数字图像处理和计算机视觉两大领域。 对图像的处理包括滤波,缩放,分割,识别(两种信息对比)等。 链接 数字图像处理 1. 数字图像处理(Digital Image Processing) 数字图像处理主要关注图…

Spring 学习笔记之 @Transactional详解

一、数据库事务基础 数据库事务&#xff08;Transaction&#xff09;是数据库管理系统中用于确保数据一致性和完整性的一种机制。它是一组操作的集合&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败&#xff0c;从而保证数据库状态的正确性。 1.1 事务的基本概念 定…

【Openlayers】Openlayers 入门教程

Openlayers 入门教程 -系列文章列表 openlayers 入门教程&#xff08;一&#xff09;&#xff1a;openlayers简介 openlayers 入门教程&#xff08;二&#xff09;&#xff1a;Map 篇 openlayers 入门教程&#xff08;三&#xff09;&#xff1a;View 篇 openlayers 入门教程&a…

【Lua语言】Lua语言快速入门

初始Lua Lua是一种轻量小巧的脚本语言&#xff0c;他使用标准C语言编写并以源代码形式开放。这意味着Lua虚拟机可以很方便的嵌入别的程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。同时&#xff0c;在目前脚本引擎中&#xff0c;Lua的运行速度占有绝对优势。 变…

车载诊断新架构--- SOVD初入门(上)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

linux查看目录相关命令

查看目录命令 学习目标 能够使用Linux命令查看目录信息 1. 查看目录命令的使用 命令说明ls查看当前目录信息tree以树状方式显示目录信息 ls命令效果图: tree命令效果图: 2. 查看当前目录路径 命令说明pwd查看当前目录路径 pwd命令效果图: 3. 清除终端内容 命令说明clear…