Letcode--35.搜索插入位置

本文分析了两种方法解决搜索插入位置的问题。暴力法通过遍历数组找到目标值的合适位置,时间复杂度为O(n);二分法适用于有序数组,通过不断缩小查找范围在O(logn)时间内找到目标值的插入位置。两种方法各有优劣,适用于不同的场景。
摘要由CSDN通过智能技术生成

在这里插入图片描述

(一)分析暴力法做题思路:

 存在四种情况:
 ①目标值=数组内某元素,返回该元素的位置
 ②目标值≠数组内任一元素,返回插入位置
 ③目标值<数组内最小元素,返回0
 ④目标值>数组内最大元素,返回最后的位置(nums的长度)

暴力法代码

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] >= target) { 
                return i;
            }
        }
        return nums.size(); 
    }
};

时间复杂度:O(n)
空间复杂度:O(1)

(二)分析二分法做题思路:

二分查找基础条件:有序数组

例如在这个数组中,使用二分法寻找元素为5的位置,并返回其下标。
在这里插入图片描述

二分法代码(1)

定义 target 是在一个在左闭右闭的区间里[left,right]
	分别处理如下四种情况
 ①目标值在数组所有元素之前  [0, -1]
 ②目标值等于数组中某一个元素  return middle;
 ③目标值插入数组中的位置 [left, right],return  right + 1
 ④目标值在数组所有元素之后的情况 [left, right], return right + 1
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
    int n =nums.size();
    int left = 0;
    int right = n-1;
    while(left <= right){
        int middle = left+((right-left)/2);
             // 防止溢出 等同于(left + right)/2
        if (nums[middle] > target) {
              // target 在左区间,所以[left, middle - 1]
            right = middle - 1;
        }
        else if(nums[middle] < target){ 
               // target 在右区间,所以[middle + 1, right]
            left = middle + 1;
        }
        else{ //num[middle] = target
            return middle;
        }
    }
    return right + 1; 
    }
};

时间复杂度:O(logn)
空间复杂度:O(1)

二分法代码(2)

定义 target 是在一个在左闭右开的区间里[left,right)
分别处理如下四种情况
 ①目标值在数组所有元素之前 [0,0)
 ②目标值等于数组中某一个元素 return middle
 ③目标值插入数组中的位置 [left, right) ,return right 即可
 ④目标值在数组所有元素之后的情况 [left, right),return right 即可
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0;
        int right = n;
         while (left < right) { 
            int middle=left+((right-left)>>1);
             if (nums[middle] > target) {
                right = middle; 
            } else if (nums[middle] < target) {
                left = middle + 1; 
            } else { // nums[middle] == target
                return middle; 
            }
        }
        
        return right;

    }
};

时间复杂度:O(logn)
空间复杂度:O(1)

方法学习来自这里~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值