算法专题(01)二分查找(02) 简单LeetCode 35

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法专题(01)二分查找(02) 简单LeetCode 35相关的知识,希望对你有一定的参考价值。


一、题目

1、题目描述

  给定一个升序的无重复元素的整型数组和一个目标值,在数组中找到目标值,并返回其下标索引。如果目标值不存在,返回它将会被按顺序插入的位置。四种极端情况的返回值如下:
  样例1(存在): [ 1 , 2 , 5 , 9 ] [1,2,5,9] [1,2,5,9] 5 5 5,输出 2;
  样例2(不存在): [ 1 , 2 , 5 , 9 ] [1,2,5,9] [1,2,5,9] 3 3 3,输出 2;
  样例3(首位): [ 1 , 2 , 5 , 9 ] [1,2,5,9] [1,2,5,9] 0 0 0,输出 0;
  样例4(尾部): [ 1 , 2 , 5 , 9 ] [1,2,5,9] [1,2,5,9] 10 10 10,输出 4;

2、基础框架

  • c++ 版本给出的基础框架代码如下,要求实现的是searchInsert这个函数,数组参数传入的是一个vector<int>,是 STL 中常用的数组容器,支持动态扩容,vector的动态扩容有兴趣了解的,可以参考以下这篇文章:《C/C++ 面试 100 例》(四)vector 扩容策略
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
    }
};

3、原题链接

LeetCode 35. 搜索插入位置

二、解题报告

1、思路分析

我们归纳总结为 3 点,如下:
  1)找到 1 个比 目标值 小的数 x x x
  2)将 目标值 插入到 x x x 的后面;
  3)插入位置应该尽量靠后;

2、时间复杂度

  • 由于每次都是将区间折半,所以时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n)

3、代码详解

class Solution {
public:

    int searchInsert(vector<int>& nums, int target) {
        int l = 0, r = nums.size() - 1;
        int ansPos = 0;
        while(l <= r) {
            int mid = (l + r) >> 1;
            if(nums[mid] < target) {    // (1)
                ansPos = mid + 1;       // (2)
                l = mid + 1;            // (3)
            }else {
                r = mid - 1;
            }
        }
        return ansPos;                  // (4)
    }
};
  • ( 1 ) (1) (1) 找到 1 个比target小的可行解nums[mid]
  • ( 2 ) (2) (2) 插入待选位置为mid + 1
  • ( 3 ) (3) (3) 为了尽量让插入的位置能靠后,继续去 [ m i d + 1 , r ] [mid+1, r] [mid+1,r] 寻找可行解;
  • ( 4 ) (4) (4) 迭代完毕,返回满足条件的最靠后的插入位置ansPos

三、本题小知识

二分时,如果不是精确查找,需要引入候选值缓存最优解。


以上是关于算法专题(01)二分查找(02) 简单LeetCode 35的主要内容,如果未能解决你的问题,请参考以下文章

算法专题(01)二分查找(03) 简单LeetCode 278

必学!二分查找(微课+PPT)|获奖微课算法专题13-6(公益交流)

二分查找专题总结 - 基础篇

算法入门 02二分查找(简单 - 第四题)LeetCode 167

专题总结—二分查找与旋转排序数组

算法专题(02)双指针(01) 简单LeetCode 977