【LeetCode】寻找比目标字母大的最小字母Java题解

191 阅读2分钟

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

题目描述

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

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

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

示例 1:

输入: letters = ["c", "f", "j"],target = "a"
输出: "c"
示例 2:

输入: letters = ["c","f","j"], target = "c"
输出: "f"
示例 3:

输入: letters = ["c","f","j"], target = "d"
输出: "f"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-smallest-letter-greater-than-target
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法每日一题是字符处理题目,题意简单明了,这个题目很重要的条件是排序后的字符列表 letters,我们利用这一条件,找到第一个比 target 的字符,即为答案。
  • 第二个重要条件是在比较时,字母是依序循环出现的。可以转化为如果便利一次letters 找不到比 target 大的字符,letters[0] 即为答案。根据以上分析,实现代码如下:
  • 在代码中,我使用了字符直接相减。为什么可以这样做?这里需要 char 的基础知识。char 类型是一个单一的 16 位 Unicode 字符;最小值是 \u0000(十进制等效值为 0);最大值是 \uffff(即为 65535);因此可以直接相减。

通过代码

class Solution {
    public char nextGreatestLetter(char[] letters, char target) {
        char ans = letters[0];
        for (char letter : letters) {
            if (letter - target > 0) {
                ans = letter;
                break;
            }
        }
        return ans;
    }
}

image.png

总结

  • 上述算法的时间复杂度是O(n),空间复杂度是O(1)
  • 坚持算法每日一题,加油!