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

灌云县城乡建设局网站jsp网站开发软件

灌云县城乡建设局网站,jsp网站开发软件,天津网站建设方案外包,系统开发报价清单明细前言 在算法竞赛中,二分查找使用的频率是非常高的,对于C选手而言,有STL中自带的lower_bound和upper_bound二分查找,可以很方便的进行二分查找。但是非C选手、或者需要自定义多条件查找的情况需要自己写一个二分,本文对…

前言

        在算法竞赛中,二分查找使用的频率是非常高的,对于C++选手而言,有STL中自带的lower_bound和upper_bound二分查找,可以很方便的进行二分查找。但是非C++选手、或者需要自定义多条件查找的情况需要自己写一个二分,本文对几种常见的二分查找写法进行讲解。

        本文使用的编程语言为Java,但代码比较好理解其他语言选手也可以查看本文来学习二分相关内容。


二分查找

        二分查找,也称折半查找,是一种可以在有序序列上进行快速查找的算法,时间复杂度是O(logn)

        常见的二分查找类型,有以下两种:

  • 查找目标值在序列中不小于目标值的第一个元素(同lower_bound,以此查到第一个位置)。

  • 查找目标值在序列中第一个大于目标值的元素(同upper_bound,以此查找到最后一个出现的位置)。

        在设置区间的时候,根据写法的不同分为下面几种:

  • 左闭右闭。

  • 左闭右开。

        根据最终获取答案的写法,又分为下面两种:

  • 在左右指针处取值。

  • 设置额外变量取值。

        本文将分不同情况,写出不同情况下的二分查找模板,帮助大家理解学习。


查找目标值在序列中不小于目标值的第一个元素

        也就是实现一个STL中的lower_bound。

左闭右闭版

/*** [l,r]左闭右闭区间 lower_bound* @param nums 递增序列* @param target 目标值* @return 返回不小于目标值的第一个元素下标*/
int lowBs(int[] nums,int target){int l=0;int r=nums.length-1;while(l<=r){int mid=l+(r-l>>1);if(nums[mid]<target){l=mid+1;}else{r=mid-1;}}return l;
}

左闭右开版

/*** [l,r)左闭右闭区间 lower_bound* @param nums 递增序列* @param target 目标值* @return 返回不小于目标值的第一个元素下标*/
int lowBs(int[] nums,int target){int l=0;int r=nums.length;while(l<r){int mid=l+(r-l>>1);if(nums[mid]<target){l=mid+1;}else{r=mid;}}return l;
}

查找目标值在序列中第一个大于目标值的元素

        也就是实现一个STL中的upper_bound。

左闭右闭版

/***  [l,r]左闭右闭 upper_bound* @param arr 递增序列* @param target 目标值* @return 返回第一个大于目标值的位置*/
int highBs(int[] arr,int target){int l=0;int r=arr.length - 1;while(l<=r){int mid=l+(r-l>>1);if(arr[mid]<=target){l=mid+1;}else{r=mid-1;}}return l;
}

左闭右开版

/***  [l,r)左闭右开 upper_bound* @param arr 递增序列* @param target 目标值* @return 返回第一个大于目标值的位置*/
int highBs(int[] arr,int target){int l=0;int r=arr.length;while(l<r){int mid=l+(r-l>>1);if(arr[mid]<=target){l=mid+1;}else{r=mid;}}return l;
}

易错问题和常见问题总结

一、需要注意区间定义和终止条件是否匹配正确

  • 左闭右闭:初始化 r = nums.length-1,终止条件 while (l <= r)

  • 左闭右开:初始化 r = nums.length,终止条件 while (l < r)

二、指针更新是否正确

  • 左闭右闭:r = mid - 1l = mid + 1

  • 左闭右开:r = mid

三、运算符优先级

        应写为:int mid = l + ( r - l >> 1)

?为什么不能写为 l + r >> 1

        如果可以保证l+r不会溢出的话,其实这样写也可以,但是为了保证不出现数据溢出,更加推荐写上面的形式。

http://www.dtcms.com/a/485109.html

相关文章:

  • 调用百度地图做全景的网站合肥企业网站建设工作室
  • 做电商的常去网站备案号网站下边
  • 建网站与建网页的区别网页制作详细设计
  • 青岛手机网站建设报价wordpress的用户名
  • 项目建设网站中文手机app开发软件
  • 滨州网站建设电话seo公司排名榜
  • 做网站维护工商经营范围是什么推广专员是做什么的
  • 做网站没资源网站平台 生态建设
  • 小说网站风格国内包装设计网站
  • 重庆勘察设计协会网站做网站是怎么做的
  • 图片墙网站源码购物网站创建
  • 设计工作室网站源码系统网站建设公司
  • 网站建设推广软文案例17网站一起做网批
  • 烟台网站建设方案报价装修第一网
  • 响应式网站设计的要求网站建设 美词原创
  • 网站与经营网站wordpress app 主题
  • 传奇网站制作网wordpress调用函数
  • 青县做网站html教程pdf
  • 网站推介方案为什么要做企业网站
  • 网站建设的实验小结主机屋网站搭建设置
  • 做论坛网站看什么书ui培训设计机构
  • 巡视组 住房与城乡建设部网站商贸行业网站建设哪家
  • 物流网站建设推广网站建设关键词
  • 宝安网站设计最好的公司网站开发第三方登录设计
  • vps如果制作论坛网站通过网站做外贸
  • 深圳电商网站制作网站建设预算明细
  • 可以打开任何网站的软件人人秀h5制作教程
  • 克拉玛依网站建设安装wordpress it works
  • 网页具有动画网站建设技术网站空间数据库需要多大
  • 帝国cms调用网站地址茶叶 企业 网站建设