二分法
搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。
输入: [1,3,5,6], 5
输出: 2
输入: [1,3,5,6], 2
输出: 1
输入: [1,3,5,6], 7
输出: 4
输入: [1,3,5,6], 0
输出: 0
方法
二分法
适用于有序数组中查找整数值。定义low为数组第一个索引,high为最后一个索引,mid为中间索引(取左)。target每次和nums[mid]比较,如果大于,则low变成mid+1;小于,high变成mid-1。
好处是时间复杂度可以抵御O(N),还不占用额外的存储空间。
时间复杂度 O(logN)
要找到target的位置,只要找到nums[pos-1]<target<=nums[pos+1]的位置即可,总结就是找到第一个大于等于target的位置,所以可以转为二分法,即不断用二分法逼近查找第一个大于等于target的下标。
class Solution35 {
public int searchInsert(int[] nums, int target) {
int length = nums.length;
int left = 0,right = length-1;
while (left <= right){
int mid = (left+right)/2;
if (target == nums[mid]){
return mid;
}
if (target > nums[mid]) {
left = mid+1;
}else if (target < nums[mid]){
right = mid-1;
}
}
return left;
}
}