1.二分查找法的基本思想
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.
2.图片理解(左闭右闭)
3.代码实现
public class leetcode704 {
public static void main(String[] args) {
int[] nums = {-1,3,4,6,5,16};
int tar = 16;
System.out.println(search(nums,tar));
}
public static int search(int[] nums, int target) {
if(target<nums[0]||target>nums[nums.length-1]){
return -1;
}
int left = 0,right = nums.length-1;
//左闭右闭区间
while(left<=right){
int mid = left+((right-left)>>2);
if(target==nums[mid])
return mid;
else if(nums[mid]<target)
left = mid+1;
else if(nums[mid]>target)
right = mid-1;
}
//左闭右开区间
// int left = 0,right = nums.length;
// while(left<right) {
// int mid = left + ((right - left) >> 2);
// if (target == nums[mid])
// return mid;
// else if (nums[mid] < target)
// left = mid + 1;
// else if (nums[mid] > target)
// right = mid - 1;
// }
return -1;
}
运行结果
**另外,需要补充的是**
二分查找的思想,大家都已经理解的差不多了,但是要写出完整的二分查找,还是有几点需要注意的。
①在mid=(left+right)/2时,为了防止两个大数相加越界,我们可以使用 mid = left + (right-left)>>1;
②左闭右开
while (left < right)
{
// 循环体
}
也就是说,这是一个左闭右开的区间:[0, n),在数组中查找元素4,如下图所示:
还有左闭右闭,如在数组中查找元素4,如下图所示:
在代码中可以看一下
你
学会了吗?