IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 力扣 35 搜索插入位置 -> 正文阅读

[数据结构与算法]力扣 35 搜索插入位置

目录

做题链接

题目要求

题目示例

思路

边界情况

不在边界时

更新下标

解决死循环问题

确定返回值

完整代码如下:


做题链接

35. 搜索插入位置 - 力扣(LeetCode) (leetcode-cn.com)


题目要求

题目示例

思路

关于数组的题目

看到时间复杂度必须使用O(log n),就想到了二分查找

要确定左右下标

还要有中间下标,更新左右下标

还要确定边界情况

边界情况

?

当给定的值最小或等于第一个值时,插入位置在?下标0?

当给定值最大时,插入位置在下标?numsSize?

当给定值等于数组最大值时,返回位置下标在?numsSize-1?

注意:给的是有序数组,边界情况开始直接比较最左边和最右边

    int left=0;
    int right=numsSize-1;
    if(nums[right] < target)
        return numsSize;
    if(nums[right] == target)
        return right;
    if(nums[left] >= target)
        return left;

不在边界时

不在边界时,使用二分查找,应有循环,循环条件应该是:

给定值大于最小值,小于最大值

nums[left]<target && nums[right]>target

用上述条件进行while循环

在循环中,需要更新左右下标位置,实现时间复杂度O(log n)

给定变量mid,中间下标 mid = (left+right)/2

更新下标

当中间下标位置的值大于给定值

那么插入位置应该在mid左边,更新右下标,right=mid

当中间下标位置的值小于给定值

那么插入位置应该在mid右边,更新左下标,left=mid

当中间下标位置的值等于给定值

那么直接返回下标位置 mid

    while(nums[left]<target && nums[right]>target)
    {
        int mid=(left+right)/2;

        if(nums[mid]>target)
        {
            right=mid;
        }

        if(nums[mid]<target)
        {
            left=mid;
        }

        if(nums[mid]==target)
        {
            return mid;
        }
    }

解决死循环问题

如果上述循环仅此的话,必然存在死循环问题,以下图为例:

我们不难发现,死循环往往发生在两个相邻下标上

并且当下标相邻后,若会死循环,那么他们第二次循环时

mid是等于left的,因此,我们直接加上left==mid的条件

如果符合:返回right下标即可

改正循环代码

    while(nums[left]<target && nums[right]>target)
    {
        int mid=(left+right)/2;
        //防止死循环
        if(mid==left)
        {
            return right;
        }

        if(nums[mid]>target)
        {
            right=mid;
        }

        if(nums[mid]<target)
        {
            left=mid;
        }

        if(nums[mid]==target)
        {
            return mid;
        }
    }

确定返回值

当上述循环停下时,必定是其中一个条件不满足上述循环

在此要判断是哪一个不满足循环条件

如果左边满足条件,右边不满足条件:

右边必然是上一步的mid更新来的

只能是小于给定值,不可能等于

直接返回右下标即可,右下标即插入位置

如果右边满足条件,左边不满足条件:

左边必然是上一步的mid更新来的

只能是大于给定值,不可能等于

直接返回左下标即可,左下标即插入位置

    if(nums[left]<target)
    {
        return right;
    }
    if(nums[right]>target)
    {
        return left;
    }

不要忘记最后的返回,见代码最后注释?


完整代码如下:

int searchInsert(int* nums, int numsSize, int target){
    int left=0;
    int right=numsSize-1;
    if(nums[right] < target)
        return numsSize;
    if(nums[right] == target)
        return right;
    if(nums[left] >= target)
        return left;
    while(nums[left]<target && nums[right]>target)
    {
        int mid=(left+right)/2;
        if(mid==left)
        {
            return right;
        }
        if(nums[mid]>target)
        {
            right=mid;
        }
        if(nums[mid]<target)
        {
            left=mid;
        }
        if(nums[mid]==target)
        {
            return mid;
        }
    }
    if(nums[left]<target)
    {
        return right;
    }
    if(nums[right]>target)
    {
        return left;
    }

    //最后不要忘记返回噢
    return ;
}

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:37:25  更:2022-05-12 16:39:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:51:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码