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

【C++二分查找】2563. 统计公平数对的数目

本文涉及的基础知识点

C++二分查找

LeetCode2563. 统计公平数对的数目

给你一个下标从 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

C++二分查找

性质一:排序后,公平数对不变。下面用分治法来证明:
∀ \forall i、j,排序后,新下标分别为:i1、,j1。
情况一:i==j,排序前后(i,j)和(j,i)不是公平数对;排序后,(i1,j1)和(j1,i1)也不是公平数对。
情况二:如果nums[i]+nums[j]不在[lower,upper],则(i,j),(j,i)不是公平数对;排序后,(i1,j1)、(j1,i1)也不是公平数对。
情况三:如果nums[i]+nums[j]在[lower,upper]。则(i,j)是公平数对,(j,i)不是。排序后,只有这两种情况:
一,(i1,j1)是数对,(j1,i1)不是数对。
二,(i1,j1)不是数对,(j1,i1)是数对。
无论那种情况,公平数对都是1,和排序前相同。

大致步骤

一,排序。
二,枚举nums[i]
三,nums[i+1,…]中寻找 nums[j]+nums[j] 在区间的数,即:
nums[j] >= lower - nums[i]
nums[j] <= upper - nums[j]
如果成立,则(i,j)一定是公平数对。

代码

核心代码

	class Solution {public:long long countFairPairs(vector<int>& nums, int lower, int upper) {sort(nums.begin(), nums.end());long long ret = 0;for (int i = 0; i < nums.size();i++) {const int& n = nums[i];auto it1 = lower_bound(nums.begin() + i+1, nums.end(), lower - n);auto it2 = upper_bound(nums.begin() + i+1, nums.end(), upper - n);ret += (it2 - it1);}return ret;}};

单元测试

vector<int> nums;int lower,  upper;TEST_METHOD(TestMethod1){nums = { 3,4 }, lower = 6, upper = 6;auto res = Solution().countFairPairs(nums, lower, upper);AssertEx(0LL, res);}TEST_METHOD(TestMethod2){nums = { 3,4 }, lower = 6, upper = 7;auto res = Solution().countFairPairs(nums, lower, upper);AssertEx(1LL, res);}TEST_METHOD(TestMethod11){nums = { 0, 1, 7, 4, 4, 5 }, lower = 3, upper = 6;auto res = Solution().countFairPairs(nums, lower, upper);AssertEx(6LL, res);}	TEST_METHOD(TestMethod12){nums = { 1,7,9,2,5 }, lower = 11, upper = 11;auto res = Solution().countFairPairs(nums, lower, upper);AssertEx(1LL, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【STM32 Blue Pill编程】-STM32CubeIDE开发环境搭建与点亮LED
  • input dispatching timeout OS 版本对应反应
  • Spring boot logback日志框架加载初始化源码
  • DVWA-IDS测试(特殊版本)
  • 前端学习笔记-JS篇-04
  • Redis中缓存穿透、缓存击穿、缓存雪崩的详解
  • 糟糕界面集锦-控件篇09
  • docker基本管理和应用
  • 记事本打不开(保姆级教程)
  • yolov8/yolov10 MLU370 实现推理/单多卡训练!
  • 【HBZ分享】Mysql索引的失效场景 以及 创建索引失败报错的原因
  • Spring IOC 小演示
  • 【区块链+乡村振兴】阳光农安农产品质量安全监管与服务平台 | FISCO BCOS应用案例
  • Fal.ai Flux 1-Pro/Viva.ai/哩布哩布AI:AI绘图部分免费工具+原图提示词Prompt
  • 慢SQL优化
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【5+】跨webview多页面 触发事件(二)
  • Apache Pulsar 2.1 重磅发布
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • express.js的介绍及使用
  • Flannel解读
  • Java编程基础24——递归练习
  • Koa2 之文件上传下载
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MQ框架的比较
  • React-Native - 收藏集 - 掘金
  • Solarized Scheme
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • VUE es6技巧写法(持续更新中~~~)
  • Vue--数据传输
  • 计算机常识 - 收藏集 - 掘金
  • 巧用 TypeScript (一)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 通过git安装npm私有模块
  • 微信小程序填坑清单
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一道面试题引发的“血案”
  • 一些关于Rust在2019年的思考
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 优化 Vue 项目编译文件大小
  • 最近的计划
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (02)Hive SQL编译成MapReduce任务的过程
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Matlab)使用竞争神经网络实现数据聚类
  • (差分)胡桃爱原石
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (十)c52学习之旅-定时器实验
  • (十三)Flask之特殊装饰器详解
  • (一)SvelteKit教程:hello world
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)