leetcode35题:搜索插入位置

文章讲述了在一个排序数组中寻找目标值并返回其索引的问题,提供了线性时间复杂度O(n)和更高效的二分查找O(logn)两种解决方案,详细解释了两种方法的实现过程和原理。
摘要由CSDN通过智能技术生成



一、题目描述?

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

示例 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

二、不同时间复杂度的代码实现以及讲解

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

代码如下:

 public int searchInsert(int[] nums, int target) {
    int n = nums.length;
    int index = 0;
    if (target > nums[n - 1]) {
        return n;
    }
    for (int i = 0; i <= n - 1; i++) {
        if (nums[i] == target) {
            index = i;
            break;
        }
        if (target > nums[i] && target < nums[i + 1]) {
            index = i + 1;
            break;
        }
    }
    return index;
}

代码讲解:

  1. 定义变量 n 并赋值为数组 nums 的长度,表示数组的大小。

  2. 定义变量 index 并初始化为 0,用于记录目标值的索引位置或插入位置。

  3. 首先检查目标值是否大于数组中最后一个元素 nums[n-1],如果是,则说明目标值应该插入到数组末尾,直接返回数组的长度 n。

  4. 使用 for 循环遍历数组,从前往后进行比较:

  5. 如果当前元素 nums[i] 等于目标值,将 index 设置为当前索引 i。

  6. 如果目标值大于当前元素 nums[i],且小于下一个元素 nums[i+1],则目标值应该插入到当前元素之后,将 index

  7. 设置为当前索引 i+1。 注意循环条件为 i <= n - 1,以确保在遍历到最后一个元素时仍然可以执行判断。

  8. 循环结束后,将 index 返回作为结果。

2.时间复杂度:O(log n)

代码如下:

 public int searchInsert(int[] nums, int target) {
        int n = nums.length;
        int left = 0, right = n - 1, ans = n;
        while (left <= right) {
            int mid = ((right - left) >> 1) + left;
            if (target <= nums[mid]) {
                ans = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return ans;
    }

代码讲解:

  1. 定义变量 n 并赋值为数组 nums 的长度,表示数组的大小。
  2. 定义变量 left 并初始化为 0,表示当前搜索范围的左边界。
  3. 定义变量 right 并初始化为 n - 1,表示当前搜索范围的右边界。
  4. 定义变量 ans 并初始化为 n,用于记录目标值的索引位置或插入位置。
  5. 进入循环,当 left 小于等于 right 时,执行以下操作:
  6. 计算中间元素的索引 mid,通过将 (right - left) >> 1(右移一位相当于除以2)加上 left 得到。
  7. 如果目标值小于等于中间元素 nums[mid],则更新 ans 为 mid,并将搜索范围缩小到左半部分,即将 right 更新为 mid - 1。
  8. 否则,目标值大于中间元素,将搜索范围缩小到右半部分,即将 left 更新为 mid + 1。
  9. 循环结束后,返回 ans。
  • 38
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啄sir.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值