算法专题(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(1n104) 个元素的升序整型数组 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、原题链接

LeetCode 704. 二分查找

二、解题报告

1、思路分析

  • 1)令初始情况下,数组下标从 0 开始,且数组长度为 n n n,则定义一个区间,它的左端点是 l = 0 l=0 l=0,右端点是 r = n − 1 r = n-1 r=n1
  • 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,mid1],迭代右区间端点: r = m i d − 1 r = mid - 1 r=mid1
  • 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代表的是lr的中点;
  • ( 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,mid1] 中,所以才有右区间赋值如下:r = mid - 1;
  • ( 7 ) (7) (7) 这一步呼应了 ( 2 ) (2) (2),表示这不到给定的数,直接返回 -1


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

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

LeetCode刷题704-简单-二分查找

LeetCode刷题704-简单-二分查找

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

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

卷进大厂系列之LeetCode刷题笔记:二分查找(简单)