【C语言】Leetcode 35. 搜索插入位置

文章目录


题目

链接: link

思路

这题较简单,就是找到目标元素的下标,或者插入位置,如果不熟练的话,一开始想到的肯定是冒泡排序,就是一个一个查下去,然后返回下表,这种冒泡排序的时间复杂度为O(n),相比较标准的二分查找来说大的很多,如果是标准的二分查找,时间复杂度就是O( l o g 2 x log_{2}x log2x)是比较小的

但是在写代码的时候我们可以考虑新建一个元素来记录下标,比如下面的代码

c 复制代码
int searchInsert(int* nums, int numsSize, int target) {
    int left = 0, right = numsSize - 1;
    int ans = numsSize;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (target <= nums[mid]) {
            right = mid - 1;
            ans = mid;
        } else
            left = mid + 1;
    }
    return ans;
}

这个代码的好处是比较清楚,一直用ans来几率下表,比所有数都大的时候就输出最开始赋值的numsSize

但是跳出这道题我们针对二分查找可以有个简单的认识

首先,设置

c 复制代码
int left = 0, right = numsSize - 1;
int mid = (left + right) / 2;

这种设置是很规范的,然后再看看你最后返回的是什么,比如说上面用按时输出ans,它是在 target <= nums[mid] 的条件下的,所以直接输出来就行了。

但是加入不让额外设置一个元素呢,那我们就学要用乐翻天来输出了

加入是以left的索引输出,那这样的话,就必须存在

c 复制代码
if (target 》= nums[mid]) {
	right = mid - 1;
}else
	 left = mid + 1;        

它的意思也很简单,就是因为要输出left,所以不能 (target >= nums[mid])的时候,不能变换left,否则永远无法使left指到下标,而是left-1可以指到

根据if的判断条件,left左边的值一直保持小于target,right右边的值一直保持大于等于target,而且left最终一定等于right+1,这么一来,循环结束后,在left和right之间画一条竖线,恰好可以把数组分为两部分:left左边的部分和right右边的部分,而且left左边的部分全部小于target,并以right结尾;right右边的部分全部大于等于target,并以left为首。所以最终答案一定在left的位置。

代码呈现

c 复制代码
//用left返回
int searchInsert(int* nums, int numsSize, int target) {
    int left = 0, right = numsSize - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (target > nums[mid]) {
            left = mid + 1;
        } else
            right = mid - 1;
    }
    return left;
}
相关推荐
Q741_14716 分钟前
每日一题 力扣 3655. 区间乘法查询后的异或 II 模拟 分治 乘法差分法 快速幂 C++ 题解
c++·算法·leetcode·模拟·快速幂·分治·差分法
EAIReport27 分钟前
国外网站数据批量采集技术实现路径
开发语言·python
超绝振刀怪28 分钟前
【C++可变模板参数】
开发语言·c++·可变模板参数
Freak嵌入式39 分钟前
MicroPython LVGL基础知识和概念:时序与动态效果
开发语言·python·github·php·gui·lvgl·micropython
2501_933329551 小时前
企业媒体发布与舆情管理实战:Infoseek舆情系统技术架构与落地解析
大数据·开发语言·人工智能·数据库开发
"菠萝"1 小时前
C#知识学习-021(文字关键字)
开发语言·学习·c#
minji...1 小时前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
zhangzeyuaaa1 小时前
Python 中的 Map 和 Reduce 详解
开发语言·python
abant21 小时前
leetcode 239 单调队列 需要一些记忆
算法·leetcode·职场和发展