当前位置:   article > 正文

⭐算法入门⭐《二分枚举》简单07 —— LeetCode 35. 搜索插入位置

⭐算法入门⭐《二分枚举》简单07 —— LeetCode 35. 搜索插入位置

一、题目

1、题目描述

  给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
  样例输入: nums = [1,3,5,6], target = 5
  样例输出: 2

2、基础框架

  • C语言 版本给出的基础框架代码如下:
int searchInsert(int* nums, int numsSize, int target){}
  • 1

3、原题链接

LeetCode 35. 搜索插入位置
剑指 Offer II 068. 查找插入位置

二、解题报告

1、思路分析

  首先,我们需要考虑一下,插入的这个位置,需要满足什么条件?
  如果我们对数组进行划分,大于等于目标值的作为绿色元素,其余作为红色元素。如果有目标值,那么绿色元素的左边界就是我们要找的索引;如果没有目标值,绿色元素的左边界也是我们要找的索引。

2、时间复杂度

  总的时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n)

3、代码详解


/************** 二分查找 数组 模板 **************/
/*

  1)传参的数组满足:红红红红红红红红绿绿绿绿绿绿绿; 
  2)返回值:绿色区段的左边界; 
*/

int isGreen(int val, int x);

int binarySearch(int *arr, int arrSize, int x) {
    int l = -1, r = arrSize;
    int mid;
    while(l + 1 < r) {
        mid = l + (r - l) / 2;
        if( isGreen(arr[mid], x) )
            r = mid;
        else
            l = mid;
    }
    return r;
}
/************** 二分查找 数组 模板 **************/

int isGreen(int val, int x) {
    return val >= x;
}

int searchInsert(int* nums, int numsSize, int target){
    return binarySearch(nums, numsSize, target);     // (1)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • ( 1 ) (1) (1) 分目标值存在和不存在考虑问题;

三、本题小知识

   有序数组一般可以优先考虑 二分查找。


四、加群须知

  相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」
  那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:

推荐阅读
相关标签