[每日打卡]寻找比目标字母大的最小字母

112 阅读1分钟

题目地址

leetcode-cn.com/problems/fi…

问题

给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。

在比较时,字母是依序循环出现的。举个例子:

如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'

分析

  1. 分析题目,寻找比目标字母大的最小的一个,简单来说就是找到比他大的第一个字母就行(因为题目说是有序的,我们可以这么思考)

  2. 第一段我们明确了要干什么,第二段就根据要求选择合适的算法,这里的话,因为是有序的,我们选择二分即可。

  3. 设置一些结束条件,也就是满足找到对应值之后的返回结果。

    3.1 当前值和目标值想等,且存在下一个,下一个和目标值不想等的时候,则返回下一个的值。

    3.2 如果最后一个,则自动回去找第一个字符。

    3.3 其他情况,默认取二分之后的start值即可。

解答

public class NextGreatestLetter {
    public static char nextGreatestLetter(char[] letters, char target) {
        int start = 0;
        int end =letters.length;
        /**
         * 二分查找,往大了找。
         */
        while (start < end) {
            int index = (start + end) / 2;
            // 1.计算当前这个index是否符合条件,且不能越界,
            if (letters[index] == target && index + 1 < letters.length && letters[index + 1] != target) {
                return letters[index + 1];
            } else {
                if (letters[index] > target) {
                    end = index;
                } else if (letters[index] <= target) {
                    start = index + 1;
                }
            }
        }
        // 如果最后一个,则自动回去找第一个字符
        if (letters[letters.length - 1] <= target) {
            return letters[0];
        }
        return letters[start];
    }

    public static void main(String[] args) {
        System.out.println(NextGreatestLetter.nextGreatestLetter(new char[]{'e','e','e','k','q','q','q','v','v','y'}, 'q'));
    }
}

结果

image.png