二分查找有序数组中等于或者接近目标值的元素
例如:nums = {1,4,6,7,9,19,23,26,34},target = 18
返回结果:19
定义left = 0,right = nums.length - 1; while循环中left=right会跳出循环,如果当nums[mid]>target时,更新right的方式为right = mid;如果此时left=right则 nums[left]和nums[right]都会大于target,所以此时需要比较nums[left]或者nums[left-1]哪一个更接近target
实现代码如下:
public int binaryfind(int[] nums , int target)
{
int size = nums.length;
if (nums[0] >= target)
{
return nums[0];
}
if (nums[size - 1] <= target)
{
return nums[size - 1];
}
int left, right;
left = 0;
right = size - 1;
//{1,4,6,7,9,19,23,26,34}
while (left < right) //相等时退出循环
{
int mid = left + (right - left) / 2;
if (nums[mid] == target)
{
return nums[mid];
}
else if (nums[mid]<target)
{
left = mid+1;
}
else
{
right = mid;//nums[mid]>target,如果mid赋值right以后,(left=right)> target,所以下面的if判断,
//分别是nums[left]、nums[left-1]和target的比较
}
}
if (left > 0 && (Math.abs(target - nums[left]) < Math.abs(target - nums[left - 1])))
{
return nums[left];
}
else
{
return nums[left-1];
}
}