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

二分查找重复情况 找最左边或最右边的位置下标

目录

    • 二分找最左边
    • 二分找最右边
    • 综合应用(剑指offer)

二分找最左边

核心思想: 先mid =(l+r)/2每次向左取整; 然后命中target的时候,右边界逼近到mid;

因为每次mid向左取整mid命中target时l代替mid位置,则循环迭代最后会卡出重复数字最左侧的位置!

可以用int arr[5] = 3 3 3 3 3 ; int target = 3; 这种极端的用例,来方便理解一下上述二分算法!

 //二分找k的最左侧位置while(l<r){mid =  (l+r)>>1; //mid向左取整if(arr[mid]>=target ) r = mid;//mid命中时右边界r代替mid位置(二分区间整体向左收缩了)else l = mid+1;}

寻找过程图示如下:

37_1


二分找最右边

核心思想: 先mid =(l+r+1)/2 每次向右取整; 然后命中target的时候,左边界逼近到mid;

因为每次mid向右取整mid命中target时l代替mid位置,则循环迭代最后会卡出重复数字最右侧的位置! 同上,不过多解释;

 //二分找target的最右侧位置while(l<r){mid =  (l+r+1)>>1; //mid向右取整if(arr[mid]<=target ) l = mid;//mid命中时左边界l代替mid位置(二分区间整体向右收缩了)else r = mid-1;}

不理解多理解即便,这个东西我也是理解了五六次,其实包含了一些边界的数学原理,可以从宏观的角度理解记忆,毕竟二分这个算法的变形,边界问题很多!


综合应用(剑指offer)

数字在升序数组中出现的次数

在这里插入图片描述

这道题要求O(logN)的时间复杂度,那肯定二分了!而且有序数组…这不是天然的二分有序条件吗;

题目解析

  • 据观察,重复的数字在有序数组中出现的位置一定是互相挨着的:

  • 那么我们只需要找到目标值k的最左侧下il标,和其最右侧下标ir,return ir-il+1; 即可!(当然,需要考虑一下k在数组中不存在的情况,这都是小问题啦)

怎么找最左侧和最右侧的k的下标,那就是上面设计的两种二分策略,需要掌握,常用!

实现代码

class Solution {
public:int GetNumberOfK(vector<int> data ,int k) {//二分找重复的最左 和 最右if(data.size()==0) return 0;int r = data.size() - 1;int l = 0;int mid;int il;int ir;//二分找k的最左侧位置while(l<r){mid =  (l+r)>>1; //向左取整if(data[mid]>=k) r = mid;//命中时右边界也向左逼近else l = mid+1;}if(data[l]!=k) return 0;//特殊情况,k不存在,返回0;il = l;//二分找k的最右侧位置l = 0;r = data.size() - 1;while(l<r){mid =  (l+r+1)>>1;//向右取整if(data[mid]<=k) l = mid;//命中时左边界也向右逼近else r = mid-1;}ir = l;return ir-il+1;}
};
http://www.lryc.cn/news/24134.html

相关文章:

  • 智慧扫码点餐系统源码
  • 分布式环境并发场景下,如何操作抢红包(或者减少库存)
  • 明星的孩子也在做的感统训练,真的有用吗?
  • 守护进程与TCP通讯
  • 在线文本翻译能力新增14个直译模型,打造以中文为轴心语言的翻译系统
  • CVE-2022-42889 Apache Commons Text 漏洞
  • 20- widedeep及函数式构建模型 (TensorFlow系列) (深度学习)
  • 大家一起做测试的,凭什么你现在拿20k,我却还只有10k?...
  • >>数据管理:DAMA简介「考试和续期」
  • React的生命周期详细讲解
  • 蓝蓝算法二期工程day3,一万年太久,只争朝夕
  • 程序代码的自动化生成方案设计
  • Go 稀疏数组学习与实现
  • MySQL 学习笔记(借鉴黑马程序员MySQL)
  • 中级工程师职称申报到底需要参加答辩不?
  • MM32开发教程(LED灯)
  • win10安装docker
  • 设计模式系列 - 代理模式及动态代理详解
  • 【分享】订阅集简云畅捷通T+cloud连接器自动同步财务费用单至畅捷通
  • GPT的发展历程
  • iOS开发笔记之九十八——关于Memory Leak总结笔记
  • HTML基础语法
  • 微软新版必应gpt人工智能体验教程
  • 你问我答|虚拟机、容器和无服务器,怎么选?
  • 某建筑设计研究院“综合布线管理软件”应用实践
  • R语言绘制SCI论文中常见的箱线散点图,并自动进行方差分析计算显著性水平
  • redux-saga
  • 【C++】-- 智能指针
  • 数据结构与算法——4时间复杂度分析2(常见的大O阶)
  • IIS解析漏洞