今日感受:💪 (ง •_•)ง 💪
题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
(1)采用直接遍历比较实现,其时间复杂度为O(n)
解题代码如下:
class Solution {
/**
不用二分法即可解决;但是题目要求用O(log(n))的时间复杂度所以用二分
*/
不用二分法解决
public int searchInsert(int[] nums, int target) {
if(nums.length == 0) {
return 0;
}
else{
for(int i =0;i<nums.length;i++){
if(target > nums[i]){
continue;
}else{
return i;
}
}
return nums.length;
}
}
}
(2)题目要求实现时间复杂度为O(log n) : 所以采用二分法进行查找
二分法解题代码如下:
class Solution {
/**
不用二分法即可解决;但是题目要求用O(log(n))的时间复杂度所以用二分
*/
//用二分法解决
public int searchInsert(int[] nums, int target) {
int l = 0,r = nums.length-1;
if(nums.length == 0){
return 0;
}else if(nums[nums.length-1] <target){
return nums.length;
} else {
while(l<r){
int midIndex = (l+r)/2;
if(nums[midIndex] < target){
l = midIndex + 1;
}else{
r = midIndex;
}
}
return r;
}
}
}
解题思路:
(1)确定数组指针范围从0开始到数组长度减1(nums.length-1)
(2)判断数组是否为null,如果为null(通过.length查看),则直接从0开始插入,return 0。
(3)判断 target是否大于数组中的最大值,如果是则直接从数组最后添加,return nums.length。
(4)如果满足上面条件,则进行二分查找以确定插入位置Index。确定遍历条件 l < r。
(5)确定中点指针 midIndex = (l+r)/2
(6)判断条件更新边界点:
1. 如果 nums[midIndex] < target 更新 l = midIndex + 1 (加1是因为取闭区间,取值可能取到midIndex + 1 的那个数)
2. 如果 nums[midIndex] >= target 更新 r = midIndex