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

专业的免费网站建设ie浏览器网址入口

专业的免费网站建设,ie浏览器网址入口,wordpress公司主题破解版,长沙地铁最新消息Day67 | 灵神 | 二分查找:统计公平数对的数目 文章目录 Day67 | 灵神 | 二分查找:统计公平数对的数目2563.统计公平数对的数目思路正确思路 完整代码补充知识:upper_bound和lower_bound**1. 返回值类型****2. 返回值指向的位置****lower_boun…

Day67 | 灵神 | 二分查找:统计公平数对的数目

文章目录

  • Day67 | 灵神 | 二分查找:统计公平数对的数目
    • 2563.统计公平数对的数目
      • 思路
        • 正确思路
      • 完整代码
      • 补充知识:`upper_bound`和`lower_bound`
      • **1. 返回值类型**
      • **2. 返回值指向的位置**
        • **lower_bound**
        • **upper_bound**
      • **3. 特殊情况处理**
      • **4. 应用场景**
      • **总结**

2563.统计公平数对的数目

2563. 统计公平数对的数目 - 力扣(LeetCode)

思路

先说一下为什么排序不会影响本道题目的结果,因为本质上是从数组中选择两个数,满足0<i<j<n,lower <= nums[i] + nums[j] <= upper的条件。就算你排序之后,那两个数还是那两个数,无非就是从[1,4]变成了[4,1]而已。

先来说一说错误的,希望大家不要和笔者一样

想的是在二分查找过程中把对数给统计了,check函数也是传入的nums[l],nums[r],lower,upper,按照题目给的条件去比较,然后判断符合条件不符合条件

这时候就发现,我符合条件以后我该往哪边收缩呢?不管往那边收缩都会漏掉情况,往左收缩会漏掉往右的情况,往右收缩会漏掉左边的,同时收缩更不用说了

所以这个时候就该发现自己的思路出了问题

class Solution {
public:bool check(long long a,long long b,long long c,long long d){if(a+b>=c&&a+b<=d)return true;return false;}long long lower_bound(vector<int>& nums,int lower, int upper){int l=0,r=nums.size();int res=0;while(l<r){int mid=l+(r-l)/2;if(check(nums[l],nums[r],lower,upper)){res++;r=mid;}elsel=mid+1;}return res;}long long countFairPairs(vector<int>& nums, int lower, int upper) {sort(nums.begin(),nums.end());return lower_bound(nums,lower,upper);}
};
正确思路

参考的灵神的思路

用j遍历数组,那么我们的nums[i]需要满足什么条件呢?

lowernums[j]≤nums[i]≤uppernums[j]

这时候你就发现呢我们只要用lower-nums[j]去找nums[i]的左边界,用upper-nums[j]去找nums[i]的右边界,那么在左右边界内的数字一定符合条件,也就是数对的数量

不过要注意是在[0,j)这个左开右闭区间进行二分,因为题目说了要i<j

完整代码

笔者的

class Solution {
public:int lower_bound(vector<int>&nums,int bound,int target){int l=0,r=bound;while(l<r){int mid=l+(r-l)/2;if(nums[mid]>=target)r=mid;elsel=mid+1;}return l;}long long countFairPairs(vector<int>& nums, int lower, int upper) {sort(nums.begin(),nums.end());long long res=0;for(int j=0;j<nums.size();j++){// < lower-nums[j] 的 nums[i] 的个数int l=lower_bound(nums,j,lower-nums[j]);// <= upper-nums[j] 的 nums[i] 的个数//这个+1是因为<=x就是(>x+1)的位置-1//这里没减1是下面的r-l懒得+1了,减了1就是[l,r]的闭区间,不减就是[l,r)的区间,效果都一样int r=lower_bound(nums,j,upper-nums[j]+1);res += r- l;} return res;}
};

灵神的使用二分查找函数的,我觉得都挺好的,多写写二分的算法也不错

class Solution {
public:long long countFairPairs(vector<int> &nums, int lower, int upper) {sort(nums.begin(),nums.end());long long ans = 0;for (int j = 0; j < nums.size(); j++) {// 注意要在 [0, j) 中二分,因为题目要求两个下标 i < jauto r = upper_bound(nums.begin(), nums.begin() + j, upper - nums[j]); // <= upper-nums[j] 的 nums[i] 的个数auto l = lower_bound(nums.begin(), nums.begin() + j, lower - nums[j]); // < lower-nums[j] 的 nums[i] 的个数ans += r - l;}return ans;}
};

补充知识:upper_boundlower_bound

upper_boundlower_bound是C++标准库中用于在已排序序列中查找边界的算法,它们的返回值是迭代器,具体行为如下:


1. 返回值类型

  • 返回值为迭代器:两者均返回指向容器中特定位置的迭代器(ForwardIterator或RandomAccessIterator),而非直接返回下标或元素值

    示例

    vector<int> v = {0, 1, 2, 2, 8, 9};
    auto it = upper_bound(v.begin(), v.end(), 2);  // it指向元素8的迭代器(即v[4])
    

2. 返回值指向的位置

lower_bound
  • 返回第一个 val 的元素位置:若存在等于val的元素,返回第一个等于val的元素的迭代器;若不存在,则返回第一个大于val的元素的迭代器;若所有元素均小于val,返回last(容器的end()迭代器)

    lower_bound(v.begin(), v.end(), 2);  // 指向第一个2的迭代器(v[2])
    
upper_bound
  • 返回第一个 > val 的元素位置:无论是否存在等于val的元素,均返回第一个大于val的元素的迭代器;若所有元素均小于等于val,返回last(容器的end()迭代器)

    upper_bound(v.begin(), v.end(), 2);  // 指向8的迭代器(v[4])
    

3. 特殊情况处理

  • 元素不存在时:若序列中无符合条件的元素,两者均返回last(即end()迭代器),表示“结束位置”

    upper_bound(v.begin(), v.end(), 9);  // 返回v.end()(指向末尾后一位置)
    
  • 元素为最大值时:若val等于最后一个元素的值,upper_bound仍返回end(),而lower_bound返回最后一个元素的迭代器


4. 应用场景

  • 计算元素出现次数:结合upper_bound - lower_bound可快速计算有序序列中某元素的出现次数

    int count = upper_bound(v.begin(), v.end(), 2) - lower_bound(v.begin(), v.end(), 2);
    
  • 插入元素保持有序:使用返回的迭代器插入新元素,可维持序列的有序性


总结

函数返回值类型指向位置特殊返回值(无匹配时)
lower_bound迭代器第一个 ≥ val 的元素end()
upper_bound迭代器第一个 > val 的元素end()

使用时需确保序列已排序,否则结果未定义


文章转载自:

http://LG0Ga99Y.fxygn.cn
http://fCoS1Gxi.fxygn.cn
http://cWFMcjFq.fxygn.cn
http://w3KJkuun.fxygn.cn
http://O2WN1UYm.fxygn.cn
http://FboI9Jdy.fxygn.cn
http://gADQa43E.fxygn.cn
http://sy3V0fqE.fxygn.cn
http://9BIjhp2s.fxygn.cn
http://CnzBMXbB.fxygn.cn
http://6K1MBt8g.fxygn.cn
http://W9WUMCyj.fxygn.cn
http://VW0CWnUh.fxygn.cn
http://BMqJY6NW.fxygn.cn
http://40RoQ67L.fxygn.cn
http://6tJlByvt.fxygn.cn
http://vArUhScG.fxygn.cn
http://IkBd27Rg.fxygn.cn
http://cNCMso9h.fxygn.cn
http://5kZfyMZe.fxygn.cn
http://pK8LK0a5.fxygn.cn
http://rGUnYjwn.fxygn.cn
http://WV5ApdFa.fxygn.cn
http://DDpAb2LX.fxygn.cn
http://4v6fEDId.fxygn.cn
http://AT7ZyjBF.fxygn.cn
http://1M5nPzN5.fxygn.cn
http://CwyNr5Se.fxygn.cn
http://fJVIst3U.fxygn.cn
http://QZSZuIdT.fxygn.cn
http://www.dtcms.com/wzjs/689996.html

相关文章:

  • 快速建站公司重庆巴南区网站开发
  • 本地南通网站建设企业展示网站 数据库设计
  • 聊城网站推广动态我要在58上面做网站
  • 腾讯有做淘宝客网站吗广州学生做网站
  • 诸暨市住房建设局网站光谷做网站
  • 展览会建设网站平台的作用做网站的网页
  • 电脑外设网站建设论文正常做网站多少钱
  • 重庆建网站wordpress+4.4.1+中文
  • 微信网站模板免费下载iis里如何装php网站
  • 免费网站宣传网站建设公司推荐时代创信
  • 列出网站目录网页设计作业html代码大全
  • 怎么查网站注册信息wordpress修改版权信息
  • 河北住房和城乡建设厅网站首网页策划案的范文
  • 做彩票网站服务器网站 繁体 js
  • 快速网站推广优化广东省自然资源厅事务中心
  • 南昌住房和城乡建设部网站电话上海比较好的外包公司
  • 腾讯云网站建设流程嘉兴网站公司
  • 网站添加地图自己做的娱乐平台网站
  • 四川鸿业建设集团网站上海待遇好的十大国企排名
  • 有没有学做蛋糕的网站和视频购物网站开发报告
  • 海口网站建设方案报价网站开发人员绩效考核
  • 常德网站建设产品写论文的好网站
  • 个人注册域名可以做网站么wordpress 标签模板下载
  • 常州建站价格文化馆门户网站建设的作用及意义
  • 怎么经营团购网站电商网站改版
  • 58同城网站建设目的个人养老缴费明细查询
  • asp和php网站的区别小语言网站建设
  • 绝味鸭脖网站建设规划书宿州商务网站建设
  • 网站备案网站名称网站开发专业就业前景分析
  • 宁波住房和建设局网站怎么做蛋糕