力扣初级算法(二分法):
- 每日一算法:二分法查找
学习内容:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
2.二分查找流程:
left=0,right=nums.length,取mid为中间值
- 如果nums[mid]==target,返回mid值,循环终止
- 如果nums[mid]>target,就说明从mid到right之间的值都是“无用的”需要挪动right,而我们能知道的接近的一个无用的值是mid,因此right必须比mid还要小才行,也即是right=mid-1;
同理,left=mid+1; - 一直循环,除非找到mid值或者发现target根本不在目标中,也就是已经完全循环了一遍(left>right),这时候的left的值就是最接近target但又大于target的值(可以拿0来举例自己画一遍过程),因此return left
3.二分查找实现:
class Solution {
public int searchInsert(int[] nums, int target) {
//二分法
//左边下标
int left = 0;
//右边下标
int right = nums.length -1;
while(left <= right){
int mid = left + (right - left)/2;
//相等,直接取出
if(nums[mid] == target){
return mid;
}else if(nums[mid]<target){ //中间值小于所给的值,从中间值加一开始往右找
left = mid + 1;
}else if(nums[mid] > target){/中间值大于所给的值,从中间值减一开始往左找
right = mid -1;
}
}
return left;
}
}