题目;
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
分析:
如果不考虑时间复杂度,完全可以暴力遍历去看数组中每一个数据的情况:
class Solution {
public int searchInsert(int[] nums, int target) {
//考虑到了三种情况,即直接与数组中元素相等;小于数组中所有数值;比当前数组数值均大
for(int i = 0;i < nums.length;i++){
if(nums[i] >= target){
return i;
}
}
//考虑最后一种情况,即插入到数组最后的位置
return nums.length;
}
}
但是这样做的时间复杂度是o(n)级别,题干要求是o(logn)级别,考虑到还是有序的数组,因此想到用二分查找的思想去解这个问题:
二分查找介绍:https://blog.csdn.net/m0_56664872/article/details/137922647?spm=1001.2014.3001.5501
使用二分查找的解题思路:
数组为左闭右闭区间的情况下,可以利用二分查找来实现。若等于中间值,直接返回mid索引位置,若不等于,则再循环结束后,得到right指针位置,并令其+1即为目标位置。
代码:
class Solution {
public int searchInsert(int[] nums, int target) {
int low = 0;
int high = nums.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (nums[mid] > target) {
high = mid - 1;
} else if (nums[mid] < target) {
low = mid + 1;
} else {
// 1.目标值等于中间的值
return mid;
}
}
// 2.目标值在数组所有元素之前 3.目标值插入数组中 4.目标值在数组所有元素之后 return right + 1;
return high + 1;
}
}