LeetCode二分查找刷题分析与总结

2020/7/18 总结

总结:二分查找算法以及leetcode体型

参考内容>>>

算法总结

算法思想

减而治之,即将大规模问题转换为小规模问题。减而治之就是分而治之的特例,将大问题划分为若干个子问题以后,最终答案只在其中一个子问题里。

不断排除不存在结果的区间或者说不断锁定目标区间

生活中的二分查找

  • 猜数字大小
  • 程序员定位bug,经常在一些逻辑关键点做一些变量的打印输出,以逐渐缩小查找范围,最终定位出问题的代码行(或者块)

二分查找模板(在循环体中排除一定不存在目标元素的区间)

基本思想

从考虑哪些元素一定不是目标元素开始考虑,根据看到的mid位置的元素,排除掉一定不可能存在目标元素的区间,而下一轮可能存在目标的子区间里继续查找

具体做法


int left=;
int right = ;

while(left<right){

//这里取mid的方式可能需要进行调整,当left=mid时需要进行向上进行调整使得mid=(left+mid+1)>>>1
mid=(left+right)>>>1;

if(check(mid)){

  right = mid+1;

}else{
   left=mid

}




}




  • 先把循环可以继续写成while(left<right),表示循环推出的时候,[left,right]这个区间里只有一个元素,这个元素有可能时目标元素;

  • ifelse语句的时候,思考当nums[mid]满足什么性质的时候,nums[mid]不是解,进而判断mid的左边有没有可能是解,mid的右边有没有可能是解(本质上就是不断缩小区间,确定最终的解可能在哪个区间)

    • 做题的经验告诉我们,思考什么么时候不是解是比较好想,如果一个数要满足多个条件,只要堆其中一个条件取反,就可以达到缩小搜索范围的目的`
    • 此时mid作为待查找数组的分界,就把它分为两个区间:一个部分可能存在目标元素,一个部分一定不存在目标元素
  • 当选取的left=mid;时候需要调整middle的选取,向上调整 mid=(left+righ+1)>>>1

  • 、退出循环的时候,一定有 left == right 成立。有些时候可以直接返回 left (或者 right,由于它们相等,后面都省略括弧)或者与 left 相关的数值,有些时候还须要再做一次判断,判断 left 与 right 是否是我们需要查找的元素,这一步叫「后处理」。

    题型

在数组中查找符合条件的元素的下标

一般而言这个数组是有序的,也可能是半有序的(旋转有序数组)

在一个有范围的区间里搜索一个整数

定位一个有范围的整数,这件事情也叫「二分答案」或者叫「二分结果」。如果题目要求的是一个整数,这个整数有明确的范围,可以考虑使用二分查找。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值