⭐算法入门⭐《二分枚举》简单05 —— LeetCode 744. 寻找比目标字母大的最小字母

⭐算法入门⭐《二分枚举》简单05 —— LeetCode 744. 寻找比目标字母大的最小字母

文章目录

一、题目

1、题目描述

  给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
  样例输入: letters = ["c", "f", "j"] target = "a"
  样例输出: "c"

2、基础框架

  • C语言 版本给出的基础框架代码如下:
char nextGreatestLetter(char* letters, int lettersSize, char target){
}

⭐算法入门⭐《二分枚举》简单05 —— LeetCode 744. 寻找比目标字母大的最小字母

3、原题链接

LeetCode 744. 寻找比目标字母大的最小字母

二、解题报告

1、思路分析

  划分数组,比给定字母大的作为绿色,否则为红色。找到绿色的最左边界,如果最左边界为 n n n,代表所有字符都比他小,则返回第一个元素;

2、时间复杂度

  总的时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2​n)。

3、代码详解


/************** 二分查找 数组 模板 **************/
/*

  1)传参的数组满足:红红红红红红红红绿绿绿绿绿绿绿; 
  2)返回值:绿色区段的左边界; 
*/

int isGreen(char val, char x);

int binarySearch(char *arr, int arrSize, char 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(char val, char x) {
    return val > x;
}

char nextGreatestLetter(char* letters, int lettersSize, char target){
    int pos = binarySearch(letters, lettersSize, target);
    if(pos == lettersSize) {
        return letters[0];
    }
    return letters[pos];
}

三、本题小知识

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

⭐算法入门⭐《二分枚举》简单05 —— LeetCode 744. 寻找比目标字母大的最小字母


四、加群须知

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

上一篇:Caused by: java.sql.SQLException: Can‘t call commit when autocommit=true 踩坑


下一篇:《Android 源码设计模式解析与实战》——第1章,第1.7节总结