算法小知识-----04.05-----寻找比目标字母大的最小字母

79 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

寻找比目标字母大的最小字母

该题出自力扣的744题——寻找比目标字母大的最小字母【简单题】,作为清明假期的最后一天,既想要休息又想不颓废自己,刚好就是每日一题的简单题,简直就是瞌睡来了枕头,哈哈哈

审题

给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'

  • 该题的题意相对比较简单,就是给出一个字符数组,并且给出一个目标的字符,找出当前数组内比目标字符大的最小字符
  • 因为是简单题,所以题目给出数组是有序的,因为是有序的,所以只需要找出比目标字符大的第一位即可
  • 暴力解法:
    • 遍历当前字符数组
    • 找到比目标字符大的即可直接返回
    • 如果不存在,即直接返回数组第一位(有序)
  • 正因为是有序,题目就可以转型为查找算法的代入,为了降低时间复杂度,可以使用二分查找算法。
  • 暴力的时间复杂度为O(n),二分的时间复杂度为O(lgn),在数据量小的时候并不太明显,但是数据量大的时候,差距就十分明显了。

编码

class Solution {
    public char nextGreatestLetter(char[] letters, char target) {
        for(char c: letters){
            if(c> target)return c;
        }
        return letters[0];
    }
}

二分查找实现

class Solution {
    public char nextGreatestLetter(char[] letters, char target) {
        int length = letters.length;
        if (target >= letters[length - 1]) {
            return letters[0];
        }
        int low = 0, high = length - 1;
        while (low < high) {
            int mid = (high - low) / 2 + low;
            if (letters[mid] > target) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }
        return letters[low];
    }
}


image.png