Leetcode 04——搜索插入位置(Java)

前言

Algorithms + Data Structures = Programs.

                                                        ————Pascal之父 Nicklaus Wirth

算法 + 数据结构 = 程序

坚持刷算法题,变得更强!

本篇博客将用两种方法解题!带你感受不一样的思路


题目及解析

 


解题目标:当此数组中有一个元素值等于给定的target值,返回其下标,如果数组元素中没有元素值等于target值,则返回插入位置的下标

肯定不是随便插入,必须保证插入此值后,数组依然保持元素值从大到小排序。


思路

因为题目要求我们用时间复杂度为O(log n)来解题,所对应的其实就是二分查找,首先我们先定义左右下标用来查找,分别是left和right,再定义一个中间下标mid,让mid去找下一次寻找下标的区间。

left从0开始,right则从数组长度减1开始。这样我们就设想一个循环,不断地进行mid =(left+right)/ 2   的运算,直到找到那个元素的下标或者适合插入的位置下标为止!


情况 1:如果当前 nums[mid] 值小于 target,那么 mid 以及 mid 左边的所有元素就一定不是「插入元素的位置」,因此下一轮搜索区间是 [mid + 1..right],下一轮把 left 移动到 mid + 1 位置,所以 left = mid + 1;
情况 2:如果 nums[mid] 值大于等于 target,那么 mid 可能是「插入元素的位置」,mid 的右边一定不存在「插入元素的位置」。如果 mid 的左边还是不存在「插入元素的位置」,我们才可以真的说 mid 是「插入元素的位置」。因此下一轮搜索区间是 [left..mid],下一轮把 right 移动到 mid 位置,所以 right = mid。最后我们就可以确定插入元素的位置了。


解题代码

class Solution {
    public int searchInsert(int[] nums, int target) {
int len = nums.length;
        // 特殊判断
        if (nums[len - 1] < target) {
            return len;
        }

        // 程序走到这里一定有 nums[len - 1] >= target,插入位置在区间 [0..len - 1]
        int left = 0;
        int right = len - 1;
        // 在区间 nums[left..right] 里查找第 1 个大于等于 target 的元素的下标
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target){
                // 下一轮搜索的区间是 [mid + 1..right]
                left = mid + 1;
            } else {
                // 下一轮搜索的区间是 [left..mid]
                right = mid;
            }
        }
        return left;
    }
}

第二种解题

这种解题非常简单,但缺点就是不符合题目要求中空间复杂度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;
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Perfectkn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值