目录

  • 欢迎浏览作者的[GitHub](https://github.com/loversgzl/Learning)
  • 二分查找概述
  • 1、查找某个值 target
  • 2、查找第一个大于(大于等于) target 的值
  • 3、查找第一个小于(小于等于) target 的值
  • 4、另一种写法,帮助你理解二分查找
  • 5、一个优秀的用二分查找寻找边界的方法

欢迎浏览作者的GitHub

二分查找概述

条件:只能对已经排序好的列表进行查找。
需求:对搜索时间要求为O(logn)一般都是二分查找。
概述:通过对经典二分查找的修改,达到日常查找的各种需求,
如1、查找某个值 target,2、查找第一个大于 target 的值,3、查找第一个小于 target 的值,4、查找第一个大于等于 target的值,5、查找第一个 小于等于 target 的值。
对于经典的算法,只要进行简单的修改,即可满足多种情况
条件:left <= right
结束时:left 指向第一个不满足 if 条件中的值,
如if(array[mid] < target):就是第一个大于等于target的值
如if(array[mid] <= target):就是第一个大于target的值

1、查找某个值 target

注意:如果不存在这个值,结束时:left > right,且 left 的坐标为第一个大于 target 的值。

public int binarySearchOne() {int[] array = {0,1,2,3,4,5,6};int target = 3;int left = 0, right = array.length-1;while(left <= right) {int mid = (left+right)/2;if(array[mid] == target)return mid;if(array[mid] < target)left = mid + 1;elseright = mid - 1;}return -1;
}

2、查找第一个大于(大于等于) target 的值

注意:结束时:left > right,如果 target 即为最大值,则会产生数组越界,需要对 left 进行判断,不能直接返回。
修改:大于等于也很好修改,只需要将 if 里的判断条件改为 if(array[mid] < target) 即可。

public int binarySearchOne() {int[] array = {0,1,2,3,4,5,6};int target = 3;int left = 0, right = array.length-1;while(left <= right) {int mid = (left + right)/2;//只修改了判断的条件,相当于将小于等于归为一类。if(array[mid] <= target)left = mid + 1;elseright = mid - 1;}return left;
}

3、查找第一个小于(小于等于) target 的值

注意:结束时:left > right,如果 target 即为最小值,则会产生数组越界,需要对 right 进行判断,不能直接返回。
修改:小于等于也很好修改,只需要将 if 里的判断条件改为 if(array[mid] > target) 即可。

public int binarySearchOne() {int[] array = {0,1,2,3,4,5,6};int target = 3;int left = 0, right = array.length-1;while(left <= right) {int mid = (left + right)/2;//只修改了判断的条件,相当于将大于等于归为一类。if(array[mid] >=  target)right = mid - 1;elseleft = mid + 1;}return right;
}

4、另一种写法,帮助你理解二分查找

算法:查找第一个大于 target 值的坐标。
注意:1、修改了循环条件:left < right,所以结束是 left == right。2、当遇到大于 target 值时,right = mid,保留当前可能的坐标。
好处:不会产生数组越界的下标,如果 target 即为最大值,则 left == right == array.length-1。否则一定会指向第一个大于 target 的坐标。

public int binarySearchTwo(int[] array, int left, int right,int target){while(left < right){ //修改了循环判断int mid = (left+right)/2;if(array[mid] <= target) //大于要保留left = mid + 1;elseright = mid;}if(array[left] >= target) //最后结束时有left==right,如果一定存在,则不需要以下语句,直接返回即可。return left;return -1; //如果target即是最大值,则返回-1;

5、一个优秀的用二分查找寻找边界的方法

例题:查找左右边界,计算目标值的数量,使用了两次查找第一个最大值。

public int search(int[] nums, int target) {return binarySearch(nums, target + 0.5) - binarySearch(nums, target - 0.5);
}private int binarySearch(int[] nums, double target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = (right + left) /2;if (nums[mid] < target) left = mid + 1;elseright = mid - 1;}return left;
}

二分查找之第一个大于小于等于 target 的值相关推荐

  1. leetcode 475. Heaters | 475. 供暖器(找最后一个不大于target的值/第一个不小于target的值)

    题目 https://leetcode.com/problems/heaters/ 题解 class Solution {public int findRadius(int[] houses, int ...

  2. C++学习笔记-----二分法之寻找非减序列第一个大于某个值的数或最后一个小于某个值的数

    二分法在对有序序列的处理上可以达到O(lg(n))的时间复杂度,通常用在二分查找上. 此时有一个有序序列,给定一个数n,n可以在这个序列中也可以不在,要求找到第一个大于n的数和第一个小于n的数. 实际 ...

  3. [C/C++]二分查找专题/最后一个小于等于目标值target的数/第一个大于等于目标值target的数

    二分查找基础 查找有序数组中 (1)某一个数 (2)最后一个小于目标值target的数 (3)最后一个小于等于目标值target的数 (3)第一个大于目标值target的数 (5)第一个大于等于目标值 ...

  4. 【二分查找延伸--实际算法应用】数组类题目

    声明:博主是基于labuladong微信公众号文章模板驱动刷题,进行的自我刷题感悟和记录在此. 模板详情见labuladong微信公众号文章文末:原创于自己在此基础上的笔记.感悟.整合其它文献和自己的 ...

  5. LeetCode——二分查找

    二分查找 目录 二分查找法 求开方 大于给定元素的最小元素 有序数组的 Single Element 第一个错误的版本 旋转数组的最小数字 查找区间 1. 二分查找法 正常实现 public int ...

  6. 二分查找算法学习总结

    目录 1.前言​ 2.算法描述 3.算法实现 3.1 代码 3.2 测试 3.3 小结 4.解决整数溢出问题 5.相关面试题 1.前言 这里是一个数组,数组里面都是些不重复的数字, 那我现在想要数组里 ...

  7. leetcode中关于使用二分查找算法思想deal的题型

    学习了二分查找的算法思想之后,再leetcode上写了一道常见的简单面试题,现在用博客记录一下我学习刷题的笔记! leetcode 题号69:Sqrt(x)(经典的面试题) 给你一个非负整数 x ,计 ...

  8. 快速排序和二分查找时间复杂度详解

    因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:一次二分剩下:n/2两次二分剩下:n/2/2 = n/4...m次二分剩下:n/(2^m)在最坏情况下是在排除到只剩下最后一个值之后得到结 ...

  9. LeetCode刷题笔记 二分查找 局部有序

    二分查找的局部有序情况 ​ 我们已经知道二分查找是一种在有序数组中查找某一特定元素的查找算法. ​ 那如果一个数组不是整体有序,而是局部有序呢?这时我们就可以通过分治策略,我们在局部有序的区间内进行二 ...

最新文章

  1. 解除微信回调的Activity必须在包名.wxapi下的限制
  2. linux shell if [[ ]]和[ ]区别 ||
  3. 馀承东鸿蒙发布会,余承东确认出席发布会!荣耀智慧屏-首发搭载鸿蒙系统
  4. wxpython 安装教程
  5. 数据结构---邻接表的DFS
  6. tensorflow越跑越慢_tensorflow如何解决越运行越慢的问题
  7. python 第13章:面向对象编程
  8. Android Oreo 常见问题 2.0 | Android 开发者 FAQ Vol.9
  9. excel删除重复数据保留一条_Excel怎么快速查找和删除重复数据
  10. 《算法图解》——数组和链表
  11. 2018.8.29牛客OI测试赛A-斐波那契题解(找规律)
  12. 【综合篇】Web前端性能优化原理问题
  13. 使用casewhen来判断执行不同的sql
  14. Java面试题十二:Java内存模型,h5移动端开发面试题
  15. 计算机技术在排水领域的应用,计算机软件在排水工程设计上的应用解析
  16. ShaderJoy —— “水面波纹消散” 的实现 【GLSL】
  17. ClassLoader和ClassForname的区别(详解)
  18. 磨金石教育手机摄影技巧||处理好照片的主次,出片率提高10倍!
  19. python归一化后全部都是0咋办_python归一化处理
  20. 苹果第四财季净利润85亿美元 同比增长13%

热门文章

  1. ncbi-genome-download在NCBI上批量下载基因组
  2. 《联邦学习介绍》(科研汇报PPT,针对无机器学习基础的同学,浅显理解)
  3. 如何检验数据样本的正态性?
  4. Windows10 2021年5月更新正式推出,驱动人生详细介绍win10更新新功能
  5. Qt 音乐盒子(在线搜索下载+本地读取播放)
  6. 中国信通院:5G无人机应用白皮书
  7. 又是一个相当 带劲的招聘起事
  8. 不明觉厉!用了近10年,才有人读懂这篇论文
  9. 腾讯云服务器的简单使用
  10. 20个最受欢迎商务旅游城市:纽约连续四年拿第一,上海第四