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){
left=mid+1;
}
else{
right=mid;
}
}
//在末尾添加的情况
if(nums[left]<target){
return left+1;
}
return left;
}
}
总结:
本题因为是寻找第一个比目标数大于/等于的数,则使用寻找左端点的二分查找模板套用即可
要在末尾进行判断解决,末尾添加元素的下标问题
山脉数组峰顶索引
题目要求:
题目要求:给定一个形似山脉的数组(先上升,再下降),寻找并且返回这个"山脉数组"的最大值
题目解析以及核心思路:
题目解析:
**二段性:**山脉数组的特点:"一段上升,一段下降"
在上升段时,选定一个数,一定大于后一个数
在下降段时,选定一个数,一定小于后一个数 核心思路:
目标:找到山峰的索引(即数组最大值的下标)
在上升段时,不确定当前数是否是最大的, 因此left不越过当前数,向右去寻找更大的
在下降段时,当前数一定不是最大的,因此right向左侧去寻找更大的数
代码实例:
java复制代码
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int left=0;
int right=arr.length-1;
while(left<right){
int mid=left+(right-left+1)/2;
if(arr[mid]>arr[mid-1]){
left=mid;
}
else{
right=mid-1;
}
}
return left;
}
}