当前位置:   article > 正文

⭐算法入门⭐《二分枚举》简单01 —— LeetCode 704. 二分查找

二分枚举

一、题目

1、题目描述

  给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
  样例输入: nums = [-1,0,3,5,9,12], target = 9
  样例输出: 4

2、基础框架

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

3、原题链接

LeetCode 704. 二分查找

二、解题报告

1、思路分析

  采用二分查找的数组模板。条件设定为val >= x,找到绿色边界,然后判断绿色边界是否为数组长度,如果是,说明全部是红色元素,所以没有找到可行解,返回-1;否则判断绿色边界对应的值是否是给定的 x x x,如果不是,则返回 -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;                       // (1)
}

int search(int* nums, int n, int target){
    int r = binarySearch(nums, n, target); // (2)
    if(r == n || nums[r] != target)        // (3)
        return -1;
    return r;                              // (4)
}

  • 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
  • 32
  • 33
  • 34
  • 35
  • ( 1 ) (1) (1) 条件是 数组的值 ≥ x \ge x x
  • ( 2 ) (2) (2) 找到绿色边界;
  • ( 3 ) (3) (3) 找到绿色边界,然后判断绿色边界是否为数组长度,如果是,说明全部是红色元素,所以没有找到可行解,返回-1;否则判断绿色边界对应的值是否是给定的 x x x,如果不是,则返回 -1,说明没有满足条件的解;
  • ( 4 ) (4) (4) 最后,一定能够找到满足条件的解,直接返回即可。

三、本题小知识

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


四、加群须知

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签