算法专题(01)二分查找(01) 简单LeetCode 704
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法专题(01)二分查找(01) 简单LeetCode 704相关的知识,希望对你有一定的参考价值。
一、题目
1、题目描述
给定 n ( 1 ≤ n ≤ 1 0 4 ) n(1 \\le n \\le 10^4) n(1≤n≤104) 个元素的升序整型数组 n u m s nums nums 和一个值 t a r g e t target target,求实现一个函数查找 n u m s nums nums 中 t a r g e t target target 的下标,如果查找不到则返回 − 1 -1 −1。
2、基础框架
- c++ 版本给出的基础框架代码如下,要求实现的是
search
这个函数,数组参数传入的是一个vector<int>
,是 STL 中常用的数组容器,支持动态扩容,vector
的动态扩容有兴趣了解的,可以参考以下这篇文章:《C/C++ 面试 100 例》(四)vector 扩容策略。
class Solution {
public:
int search(vector<int>& nums, int target) {
}
};
3、原题链接
二、解题报告
1、思路分析
- 1)令初始情况下,数组下标从 0 开始,且数组长度为 n n n,则定义一个区间,它的左端点是 l = 0 l=0 l=0,右端点是 r = n − 1 r = n-1 r=n−1;
- 2)生成一个区间中点 m i d = ( l + r ) / 2 mid = (l + r) / 2 mid=(l+r)/2,并且判断 m i d mid mid 对应的数组元素和给定的目标值的大小关系,主要有三种:
- 2.a)目标值 等于 数组元素,直接返回 m i d mid mid;
- 2.b)目标值 大于 数组元素,则代表目标值应该出现在区间 [ m i d + 1 , r ] [mid+1, r] [mid+1,r],迭代左区间端点: l = m i d + 1 l = mid + 1 l=mid+1;
- 2.c)目标值 小于 数组元素,则代表目标值应该出现在区间 [ l , m i d − 1 ] [l, mid-1] [l,mid−1],迭代右区间端点: r = m i d − 1 r = mid - 1 r=mid−1;
- 3)如果这时候 l > r l > r l>r,则说明没有找到目标值,返回 − 1 -1 −1;否则,回到 2)继续迭代。
2、时间复杂度
- 由于每次都是将区间折半,所以二分查找的时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n)。
3、代码详解
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size() - 1; // (1)
while(l <= r) { // (2)
int mid = (l + r) >> 1; // (3)
if(nums[mid] == target) {
return mid; // (4)
}else if(target > nums[mid]) {
l = mid + 1; // (5)
}else if(target < nums[mid]) {
r = mid - 1; // (6)
}
}
return -1; // (7)
}
};
-
(
1
)
(1)
(1) 由于
vector
的下标和数组一样是从 0 开始的,所以初始的左右查找区间端点为 0 和 数组长度减一,nums.size()
返回的是数组的长度; - ( 2 ) (2) (2) 一直迭代左右区间的端点,直到 左端点 大于 右端点 结束;
-
(
3
)
(3)
(3)
>> 1
等价于除 2,也就是这里mid
代表的是l
和r
的中点; -
(
4
)
(4)
(4)
nums[mid] == target
表示正好找到了这个数,则直接返回下标mid
; -
(
5
)
(5)
(5)
target > nums[mid]
表示target
这个数在区间 [ m i d + 1 , r ] [mid+1, r] [mid+1,r] 中,所以才有左区间赋值如下:l = mid + 1;
-
(
6
)
(6)
(6)
target < nums[mid]
表示target
这个数在区间 [ l , m i d − 1 ] [l, mid - 1] [l,mid−1] 中,所以才有右区间赋值如下:r = mid - 1;
-
(
7
)
(7)
(7) 这一步呼应了
(
2
)
(2)
(2),表示这不到给定的数,直接返回
-1
;
以上是关于算法专题(01)二分查找(01) 简单LeetCode 704的主要内容,如果未能解决你的问题,请参考以下文章
算法专题(01)二分查找(02) 简单LeetCode 35