力扣搜索插入位置

题目

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

请必须使用时间复杂度为 O(log n) 的算法。

示例 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 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为 无重复元素 的 升序 排列数组
-104 <= target <= 104

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-insert-position
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  • 要找到一个下标,该下标的值>=目标,且下标-1的值<目标
  • 1.设定初始范围
  • 2.判断条件
  • 2.1该下标的值>=目标,且下标-1的值<目标,满足该条件,即是答案, 直接输出即可
  • 2.2该下标的值>=目标,"但下标-1的值>目标",说明中值太大了,需要减少范围最大值
  • 2.3"该下标的值<目标",说明中值太小了,需要增加范围最小值
  • 3.边界条件
  • 3.1如果目标是下标0的值,此时下标-1的值不存在,要怎么办?
  • 3.2如果目标比数组内最大的值都大,怎么办?
  • 解决方法
  • 分别加个特殊判断条件,直接跳出即可
  • 1.当目标小于等于下标0的值,直接返回下标0
  • 2.当目标大于等于下标最大的值,直接放回最大的下标+1

代码

点击查看代码
int searchInsert(int* nums, int numsSize, int target){
int left,right,middle,shuchu;   //分别是范围最小值,范围最大值,范围中值,输出值
int search(int xiabiao)
{
    if(nums[xiabiao]>=target&&nums[xiabiao-1]<target)
    {
        shuchu = xiabiao;   //储存输出值
        return 0;
    }
    else if(nums[xiabiao]>=target&&nums[xiabiao-1]>=target)
    {
        right=middle-1;
    //  该下标的值>=目标,"但下标-1的值>目标",说明中值太大了,需要减少范围最大值
    }
    else if(nums[xiabiao]<target)
    {
        left=middle+1;
    //  "该下标的值<目标",说明中值太小了,需要增加范围最小值
    }
    middle=(left+right)/2;
    search(middle);
    return 0;
}
//  如果目标是下标0的值,此时下标-1的值不存在,要怎么办?
//  分别加个特殊判断条件,直接跳出即可
//  当目标小于等于下标0的值,直接返回下标0
if(target<=nums[0])
{
    return 0;
}
//  当目标大于等于下标最大的值,直接放回最大的下标+1
else if(target>nums[numsSize-1])
{
    return numsSize;
}
//设定初始范围
else
{
    left=0;
    right=numsSize-1;
    middle=(left+right)/2;
    search(middle);
}
return shuchu;  //返回输出值
}

本篇扯淡

  • 话说我写这里的是为什么呢?如果只是想写题解的话,发在力扣那不就行了,何必在我这再发一次呢?
  • 仔细思索一番后,得出结论,这是对我学习过程的记录,他证明了我的存在,见证我的曾经
  • 毕竟对我而言,个人博客就如同自己的一个小天地似的,就算内容没有意义,但只要存在内容,那对我而言,就已经很有意义了
  • 所以接着做吧,无论好坏,相信自己,总会逐渐变好的,等我学的差不多了,有余力了,也会把内容给优化的。
  • 最后,如果有谁闲的来看我扯淡,那我祝你生活愉快,过得开心~(* ̄︶ ̄)
posted @ 2022-12-30 12:06  淦丘比  阅读(24)  评论(0编辑  收藏  举报