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

Leetcode-2563. 统计公平数对的数目

思路

二分查找

解题过程

首先需要理解:顺序并不影响公平数对的个数。因为满足公平数对条件必然存在先后关系,排序后也并不改变这一点。所以可以先对数组进行排序。排序后才便于用二分查找寻找边界。

其次不能二重循环遍历,会超过时间限制,可以选择固定公平数对的一个数,查找符合条件的另一个数。为了避免重复计算,在考虑num[i]的另一个数的时候,只考虑nums[0~i-1]是否符合条件。

当固定了nums[i]的时候,只要另一个数的大小满足条件lower-nums[i]≤nums[0~i-1]≤upper-nums[i]即可。

根据上述思路,就考虑到用二分查找来寻找边界。也就是i左侧第一个大于等于lower-nums[i]的位置i左侧最后一个小于等于upper-nums[i]的位置。其中的数都满足条件,就可以更新结果计数。

二分查找模板

bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;    // check()判断mid是否满足性质else l = mid + 1;}return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{while (l < r){int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}return l;
}

code

c++

手写二分

class Solution {
public:long long countFairPairs(vector<int>& nums, int lower, int upper) {long long ans = 0;int n = nums.size();sort(nums.begin(), nums.end());// 维护(x,i)对for (int i = 1; i < n; i++) {int low_req = lower - nums[i];int up_req = upper - nums[i];// 二分查找 i 左侧第一个大于等于low_req的位置int l = 0, r = i - 1;while (l < r) {int mid = l + r >> 1;if (nums[mid] >= low_req) r = mid;else l = mid + 1;}int low_idx = l;// 二分查找 i 左侧最后一个小于等于up_req的位置l = 0, r = i - 1;while (l < r) {int mid = l + r + 1 >> 1;if (nums[mid] <= up_req) l = mid;else r = mid - 1;}int up_idx = l;if(up_idx == low_idx){if(nums[up_idx] <= up_req && nums[low_idx] >= low_req) ans += 1;}else{ans += up_idx - low_idx + 1;}}return ans;}
};

借助函数

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

python

class Solution:def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:ans = 0nums.sort()n = len(nums)for i in range(1, n):left = bisect_left(nums, lower - nums[i], 0, i)right = bisect_left(nums, upper - nums[i], 0, i)while right < i and nums[i] + nums[right] == upper:right += 1ans += right - leftreturn ans

复杂度

时间复杂度: O ( n log ⁡ N ) O(n\log N) O(nlogN) ,每次二分查找耗时,总共执行n次。
空间复杂度: O ( 1 ) O(1) O(1)

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

相关文章:

  • prometheus 配置邮件告警
  • Unity2D 街机风太空射击游戏 学习记录 #13 射击频率道具 最高分
  • 如何使typora图片不居中留白?
  • 【网络安全】从IP头部看网络通信:IPv4、IPv6与抓包工具 Wireshark 实战
  • WinUI3入门11:改变鼠标形状 设置光标
  • 鸿蒙应用开发中的状态管理:深入解析AppStorage与LocalStorage
  • 基于Qt C++的影像重采样批处理工具设计与实现
  • jenkinsfile调用groovy
  • 服务器安装指南
  • 从iOS到Flutter:我的转型之路与技术成长启示
  • Redis哈希表Rehash全解析:扩容缩容背后的渐进式智慧
  • 一种集成统计、视觉和基于规则方法的新型可解释医学图像分类人工智能框架|文献速递-最新论文分享
  • ffmpeg下载地址
  • wpf单文件打包还有 一些dll打包不进去?
  • 基于单片机的语音控制设计(论文)
  • PYTHON从入门到实践2-环境配置与字符串打印用法
  • 【开源项目】比 PyInstaller 更方便:图形界面打包 Python 脚本的体验
  • linux nginx更换域名证书
  • Ubuntu服务器中MySQL如何进行主从复制
  • 解锁阿里云AnalyticDB:数据仓库的革新利器
  • 支持向量机(SVM)python语言版本
  • 从0开始学习R语言--Day31--概率图模型
  • FPGA基础 -- Verilog 验证平台之 **cocotb 验证 `阶乘计算模块(factorial)` 的例子**
  • 洛谷P1092 [NOIP 2004 提高组] 虫食算
  • 基于DE1-SoC的My_First_oneAPI(一)
  • SpringBoot 3.0 - 自定义注解+拦截器+Redis 解决接口幂等性
  • 【apache-maven3.9安装与配置】
  • 从虚拟机角度解释python3相对导入问题(下)
  • 轻量化实物建模革命:WebGL如何实现复杂模型的高效加载与交互
  • ​CentOS 7 单用户模式重置 root 密码完整指南