【java】实战-力扣题库:二分查找
$ 问题:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
$ 原理
一个有序数组,
定义两个指针,left表示开始,right表示结束。
和mid作比较,比mid小,进入左半部分;比mid大,进入右半部分。
左半部分: left不变, right变为mid-1。
右半部分: right不变, left变为 mid+1.
java代码实现:
class Solution {
public int search(int[] nums, int target) {
int left=0;
int right=nums.length-1;
while(right>=left){
int mid=(left+right)/2;
if(target==nums[mid]){
//找到
return mid;
}else if(target>nums[mid]){
left=mid+1;
}else{
right=mid-1;
}
}
return -1;
}
}
当下没问题,后续会有问题。
若
while(left<right){
left=mid
right=mid+1
}
若left=mid 或right=mid,可能会出现死循环。
例:查找12.5
陷入死循环,left一直等于5,mid一直等于5.
或者:
这种也不行,当查找18时,left==right时应该是找到了,但是跳出循环了。
实际上:
可以这样:
while(left<right){
left=mid+1;
right=mid;
}