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

每日一题(5)

统计公平数对的数目


第一个暴力遍历但是会超时

class Solution {
public:long long countFairPairs(vector<int>& nums, int lower, int upper) {int n=nums.size();long long count=0;for(int i=0;i<n-1;++i){for(int j=i+1;j<n;++j){if( nums[i] + nums[j]>=lower&& nums[i] + nums[j]<=upper)count++;}}return count;}
};

这个就是直接根据条件直接进行判断但可能因为复杂度过高导致不会通过

第二个是二分查找法

由于是lower <= nums[i] + nums[j] <= upper可以给两边同时减去nums[j]后就变成了lower-nums[j]<=nums[i]<=upper-nums[j];这样的话只需要找到这俩个数中间的元素就可以了省去了麻烦可以用库函数进行,upper_bound 返回指向第一个大于 upper - nums[j] 的元素的迭代器,即所有小于等于 upper - nums[j] 的元素的范围的结束位置lower_bound 返回指向第一个不小于 lower - nums[j] 的元素的迭代器,即满足条件的起始位置

class Solution {
public:long long countFairPairs(vector<int>& nums, int lower, int upper) {sort(nums.begin(),nums.end());int n=nums.size();long long count=0;for(int j=0;j<n;++j){auto l=upper_bound(nums.begin(),nums.begin()+j,upper-nums[j]);auto r=lower_bound(nums.begin(),nums.begin()+j,lower-nums[j]);count+=l-r;}return count;}
};

为什么排序不影响结果?数对 (i, j) 是无序的,即 (i, j) 和 (j, i) 被认为是同一个数对题目要求 i < j,这意味着我们只关心数对的组合,不关心原始顺序每个元素的值保持不变,只是位置发生了变化,数对 (nums[i],nums[j]) 的和 nums[i] + nums[j] 保持不变,满足条件的数对组合没有改变,只是它们的索引位置发生了变化

方法三用三指针

class Solution {
public:long long countFairPairs(vector<int>& nums, int lower, int upper) {ranges::sort(nums);long long ans = 0;int l = nums.size(), r = l;for (int j = 0; j < nums.size(); j++) {while (r && nums[r - 1] > upper - nums[j]) {r--;}while (l && nums[l - 1] >= lower - nums[j]) {l--;}ans += min(r, j) - min(l, j);}return ans;}
};

方法是差不多的和第二个只是变成了指针

为什么需要 min(r, j) 和 min(l, j)?

这些指针是基于整个排序后数组计算的,没有考虑 i < j 的限制


文章转载自:

http://vu1zI4wt.mdwLg.cn
http://mqBzkzkr.mdwLg.cn
http://NQJJVkmQ.mdwLg.cn
http://yQ6FbRw5.mdwLg.cn
http://XstSiZdB.mdwLg.cn
http://QOFDAjh5.mdwLg.cn
http://2SoCDEfY.mdwLg.cn
http://OuOWxW4y.mdwLg.cn
http://GbZU43GM.mdwLg.cn
http://4X763Rcg.mdwLg.cn
http://jEjID9rU.mdwLg.cn
http://cwZCUYCy.mdwLg.cn
http://svfdSN75.mdwLg.cn
http://jhwdv5JL.mdwLg.cn
http://GGYTTwAO.mdwLg.cn
http://cYeeEbww.mdwLg.cn
http://Ufvh8GOw.mdwLg.cn
http://kgroIxso.mdwLg.cn
http://mUXlZnoV.mdwLg.cn
http://Pk7hFN3h.mdwLg.cn
http://XloODdb6.mdwLg.cn
http://Whtufn7Y.mdwLg.cn
http://Q4JL0AGw.mdwLg.cn
http://QYA1gqiu.mdwLg.cn
http://ZlJ5Cp8W.mdwLg.cn
http://JMCCQEWj.mdwLg.cn
http://eDTFTvjk.mdwLg.cn
http://jzEcHeUU.mdwLg.cn
http://zl944koX.mdwLg.cn
http://mFAXzo29.mdwLg.cn
http://www.dtcms.com/a/380265.html

相关文章:

  • Lumerical licence center 无法连接的问题
  • Java网络编程(2):(socket API编程:UDP协议的 socket API -- 回显程序)
  • Java 类加载机制双亲委派与自定义类加载器
  • OpenLayers数据源集成 -- 章节九:必应地图集成详解
  • 前端调试工具有哪些?常用前端调试工具推荐、前端调试工具对比与最佳实践
  • 【C++练习】16.C++将一个十进制转换为二进制
  • 公司本地服务器上搭建部署的办公系统web项目网站,怎么让外网访问?有无公网IP下的2种通用方法教程
  • 【C++】string类 模拟实现
  • 【系列文章】Linux中的并发与竞争[02]-原子操作
  • 微信小程序 -开发邮箱注册验证功能
  • 使用ollama启动文心开源大模型0.3b版本
  • 【langchain】构建检索问答链
  • QT M/V架构开发实战:QSqlQueryModel/ QSqlTableModel/ QSqlRelationalTableModel介绍
  • 网络编程入门:构建你的第一个客户端-服务器应用
  • 极简灰度发布实现新老风控系统切流
  • 基于跳跃表的zset实现解析(lua版)
  • 【学习K230-例程18】GT6700-HTTP-Server
  • Redis列表(List):实现队列/栈的利器,底层原理与实战
  • 超级流水线和标量流水线的原理
  • 漫谈《数字图像处理》之边缘检测与边界预处理的辨析
  • (二)文件管理-文件查看-less命令的使用
  • 深入理解节流(Throttle):原理、实现与应用场景
  • 汽车电子电气架构中的电源架构(下)
  • GISBox与GeoServer使用体验全对比:轻量化工具如何重新定义GIS价值?
  • 02.【Linux系统编程】Linux权限(root超级用户和普通用户、创建普通用户、sudo短暂提权、权限概念、权限修改、粘滞位)
  • JavaEE 初阶第二十二期:网络原理,底层框架的“通关密码”(二)
  • Netty 实战应用:从 RPC 到即时通讯,再到 WebSocket
  • 南京方言数据集|300小时高质量自然对话音频|专业录音棚采集|方言语音识别模型训练|情感计算研究|方言保护文化遗产数字化|语音情感识别|方言对话系统开发
  • Django全栈班v1.04 Python基础语法 20250912 下午
  • uniapp多端打包样式处理