LeetCode二分查找:寻找比目标字母大的最小字母

  • 如果评论区没有及时回复,欢迎来公众号:ByteCode 咨询
  • 公众号:ByteCode。致力于分享最新技术原创文章,涉及 Kotlin、Jetpack、算法、译文、系统源码相关的文章

题目来源于 LeetCode 上第 744 号(Find Smallest Letter Greater Than Target)问题:寻找比目标字母大的最小字母。题目难度为 Easy。

题目描述

Given a list of sorted characters letters containing only lowercase letters, and given a target letter target, find the smallest element in the list that is larger than the given target.

Letters also wrap around. For example, if the target is target = ‘z’ and letters = [‘a’, ‘b’], the answer is ‘a’.

Examples:
Input:
letters = ["c", "f", "j"]
target = "a"
Output: "c"

Input:
letters = ["c", "f", "j"]
target = "c"
Output: "f"

Input:
letters = ["c", "f", "j"]
target = "d"
Output: "f"

Input:
letters = ["c", "f", "j"]
target = "g"
Output: "j"

Input:
letters = ["c", "f", "j"]
target = "j"
Output: "c"

Input:
letters = ["c", "f", "j"]
target = "k"
Output: "c"

Note:
1. letters has a length in range [2, 10000].
2. letters consists of lowercase letters, and contains at least 2 unique letters.
3. target is a lowercase letter.

二分查找

从题意分析从有序列表中找比目标字母大的最小字母得知,这题应该使用二分查找,因为二分查找的时间复杂度 O(logn)

但是这题目有个坑,就是题意给的不准确,笔者也提交几次才通过,总结规律如下:

  • 当 target < letters[0] 时,即 letters[0] 是比目标字母大的最小字母,返回 letters[0]
  • 当 target >= letters[height -1], 即返回 letters[0]

Java 实现

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

Koltin 实现

class Solution {

fun nextGreatestLetter(letters: CharArray, target: Char): Char {
var low = 0
var height = letters.size - 1
if (target < letters[0] || target >= letters[height]) {
return letters[0]
}

while (low <= height) {
val mid = (low + height) ushr 1
when {
letters[mid] <= target -> low = mid + 1
else -> height = mid - 1
}
}
return letters[low]
}

}

致力于分享一系列 Android 系统源码、逆向分析、算法、翻译、Jetpack 源码相关的文章,在技术的道路上一起前进

Android10 源码分析

正在写一系列的 Android 10 源码分析的文章,了解系统源码,不仅有助于分析问题,在面试过程中,对我们也是非常有帮助的,如果你同我一样喜欢研究 Android 源码,可以关注我 GitHub 上的 Android10-Source-Analysis

算法题库的归纳和总结

由于 LeetCode 的题库庞大,每个分类都能筛选出数百道题,由于每个人的精力有限,不可能刷完所有题目,因此我按照经典类型题目去分类、和题目的难易程度去排序。

  • 数据结构: 数组、栈、队列、字符串、链表、树……
  • 算法: 查找算法、搜索算法、位运算、排序、数学、……

每道题目都会用 Java 和 kotlin 去实现,并且每道题目都有解题思路,如果你同我一样喜欢算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:Leetcode-Solutions-with-Java-And-Kotlin

精选国外的技术文章

目前正在整理和翻译一系列精选国外的技术文章,不仅仅是翻译,很多优秀的英文技术文章提供了很好思路和方法,每篇文章都会有译者思考部分,对原文的更加深入的解读,可以关注我 GitHub 上的 Technical-Article-Translation

评论