算法19.0
注意事项:补药跳过一些课程 课程是循序渐进的
二分查找算法:
特点:最恶心 细节最多 最容易写出死循环的算法-----》最简单
侧重点:算法原理 数组有序的情况X
模板(固定的格式): 补药死记硬背 理解之后再记忆
朴素二分模板 查找左边界的二分模板 查找右边界的二分模板
704. 二分查找 - 力扣(LeetCode)
暴力解法:
从左往右遍历一遍 找到元素就返回 没找到就返回-1
优化暴力解法:

随便找一个数 4 这样就可以把4之前的所有元素干掉(单调性)
同理找一个数字7 就可以把7后面之后所有的元素干掉

在一个数组中 随便找了一个点 发现拿这个值和target做比较划分了两个区域
其中根据根据规律可以有选择性的舍去一个区间 此时就称这个题有二段性
这个时候就可以使用二分查找
二段性:当我们发现一个规律 然后根据这个规律选取某个点之后 能把这个数组分成两部分 根绝规律能有选择性的舍去一部分 进而在另一个部分选择的时候
为什么选择中间这个点?

实现步骤

细节问题
循环结束的条件 left>right (left=right的时候 其实也是没有使用过那个元素所以不完整)
二分查找算法为什么是正确的
时间复杂度为什么快 logN (log是非常快的 4X10的9次在log上面只需要32次)
下面是题目、效果图和代码:


class Solution {public int search(int[] nums, int target) {int left = 0 ;int right = nums.length-1;while(left <= right){ //注意循环条件 //int mid = (left+right)/2 ; //有溢出的风险 left+right可能超出int的数据范围//优化 int mid = left+(right-left)/2;//这样的话中间点绝对不溢出if(nums[mid]<target) left=mid+1;else if(nums[mid]>target) right = mid-1;else return mid;} return -1;}
}
//xiyu251029&1#3*1
