写二分查找题关键是找出题目中要求的答案;
采用两边夹的方式,每一轮把待搜索区间分成两个部分,排除掉一定不是答案的区间,最后左右指针重合的地方就是我们要找的元素。
第一题:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
class Solution {
public int searchInsert(int[] nums, int target) {
int l = 0;
int r = nums.length;
while(l<r){
int mid = l+((r-l)>>>1);
if(nums[mid]>=target){
r = mid;
}else{
l=mid+1;
}
}
return l;
}
}
第二题:
符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int l = 1;
int r = arr.length - 2;
while(l<=r){
int mid = l+((r-l)>>>1);
if(arr[mid]>arr[mid-1]){
l=mid+1;
}else{
r = mid-1;
}
}
return r;
}
}