二分法寻找第一个值,最后一个值-在排序数组中查找元素的第一个和最后一个位置(binarySearchFirst34)
二分法及进阶
1.二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
注意栈溢出问题:
如果low和high都等于231-1,则int型的mid=(low+high)/2就容易溢出。
解决方法:mid=low+(high-low)/2;
class Solution {
public int search(int[] nums, int target) {
int low=0,high=nums.length-1,mid=-1;
while(low<=high)
{
mid=low+(high-low)/2;
if(nums[mid]==target) break;
if(nums[mid]<target) low=mid+1;
else high=mid-1;
}
if(low>high) return -1;
return mid;
}
}
2. 二分查找第一个值
给定一个升序排列的整数数组 nums,和一个目标值 target。数组内的值有重复,找出给定目标值在数组中的开始位置
思路:找到第一个值后,end=mid, 继续向前寻找。
直到start+1>end
public int binarySearchFirst(int start, int end, int target) {
int mid;
while (start + 1 < end) {
mid = start + (end - start)/2;
if (Nums[mid] == target) end = mid;
else if (Nums[mid] < target) start = mid + 1;
else end = mid - 1;
}
if (Nums[start] == target) return start;
if (Nums[end] == target) return end;
return -1;
}
3.二分查找最后一个值
同理,查找到第一个值后,start=mid, 继续向后查找。
public int binarySearchLast(int start, int end, int target) {
int mid;
while (start + 1 < end) {
mid = start + (end - start) / 2;
if (Nums[mid] == target) start = mid;
else if (Nums[mid] < target) start = mid + 1;
else end = mid - 1;
}
if (Nums[end] == target) return end;
if (Nums[start] == target) return start;
return -1;
}