算法专题(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、原题链接
二、解题报告
1、思路分析
- 对比 【算法专题(01)二分查找(01) 简单】LeetCode 704,区别在于上一题是找一个确定的数,而这一题在找不到合适的数时,需要返回一个合适的插入位置。
我们归纳总结为 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(公益交流)