二分法:
1.原理:
在升序数组 nums 中寻找目标值nums[i],对于特定下标 i,比较nums[i] 和target 的大小:
如果 nums[i] = target ,则下标 i 即为要寻找的下标;
如果 nums[i] > target,则 target 只可能在下标 i 的左侧;
如果 nums[i] < target,则 target只可能在下标 i 的右侧。
基于上述事实,可以在有序数组中使用二分查找寻找目标值。
二分查找的做法是,定义查找的范围[left,right],初始查找范围是整个数组。每次取查找范围的中点mid,比较 nums[mid] 和 target 的大小,如果相等则 mid 即为要寻找的下标,如果不相等则根据 nums[mid] 和target 的大小关系将查找范围缩小一半。
由于每次查找都会将查找范围缩小一半,因此二分查找的时间复杂度是 O(logn),其中 n是数组的长度。
一般获取数组中点的方法为:
intmid=left+(right-left)/2;
这样做的好处是可以防止数据过大,超过int的界限。
2.代码实现:
intleft=0;
intright=nums.length-1;
intmid=left+(right-left)/2;
while(left<=right){
if(nums[mid]==target){
returnmid;
}
if(nums[mid]>target){
right=mid-1;
intmid=left+(right-left)/2;
//目标值小于nums[mid],变化右边界值,缩小范围
}
if(nums[mid]<target){
left=mid+1;
intmid=left+(right-left)/2;
//目标值小于nums[mid],变化左边界值,缩小范围
}
}
return-1;