给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
简单题
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
解题思路
在一个有序数组中进行查找和插入,二分查找无疑是最快最简单和常用的方法。
class Solution {
public int searchInsert(int[] nums, int target) {
int right = nums.length-1; //数组最右端下标
int lelft = 0; //数组最左端下标
if (nums[lelft] >= target) {return lelft;} //当目标值小于等于数组最左端的值时
if (nums[right] == target) { return right; }
if (nums[right] < target) { return right+1; } //当目标值大于等于数组最右端的值时,直接定义为下标加一
while (true){
int m = (right+lelft)/2; //取中
if (nums[m] == target) {
return m;
}else if (nums[m] > target){
right = m;
}else if (nums[m] < target){
lelft = m+1; /*因为取中时是向下取整,当right和lelft相差一的时候,取lelft需要加一才能前进,不然会陷入死循环*/
}
if (right<=lelft){ /*当查找结束时,没有查询到,判断目标值在最后一个元素的左边还是右边*/
if (nums[lelft] > target) {
return lelft;
}else{return lelft-1;}
}
}
}
}