力扣744:寻找比目标字母大的最小字母; LeetCode744:Find Smallest Letter Greater Than Target

题目见文末

LeetCode link

思路及题解

手写二分

源码:

class Solution:
    def nextGreatestLetter(self, letters: List[str], target: str) -> str:
        if letters[0] > target or letters[-1] <= target:
            return letters[0]
        start = 1
        end = len(letters)-1
        while start < end:
            mid = (start + end) // 2
            if letters[mid] > target:
                end = mid
            else:
                start = mid + 1
        return letters[start]

执行结果

40 ms, 16.9 MB

解析

刚开始想到的就是二分查找,在查找之前,先排除两种情况:

  1. 列表首位元素满足要求,返回该元素,程序结束。
  2. 列表末位元素也不满足要求,返回首位元素,程序结束。
    然后开始二分查找。

使用python内置函数

源码

class Solution:
    def nextGreatestLetter(self, letters: List[str], target: str) -> str:
        r = bisect_right(letters, target)
        if r == len(letters):
            r = 0
        return letters[r]

执行结果

44 ms, 16.9 MB

解析

python 内置了二分算法操作的模块bisect,如果不想手写的话,也可以使用内置函数。

模块结构

根据题意:sorted in non-decreasing orderthe smallest character in the array that is larger than target ,所以使用 bisect_right 函数确定位置:

def bisect_right(a, x, lo=0, hi=None):
    """Return the index where to insert item x in list a, assuming a is sorted.

    The return value i is such that all e in a[:i] have e <= x, and all e in
    a[i:] have e > x.  So if x already appears in the list, a.insert(x) will
    insert just after the rightmost x already there.

    Optional args lo (default 0) and hi (default len(a)) bound the
    slice of a to be searched.
    """

    if lo < 0:
        raise ValueError('lo must be non-negative')
    if hi is None:
        hi = len(a)
    while lo < hi:
        mid = (lo+hi)//2
        # Use __lt__ to match the logic in list.sort() and in heapq
        if x < a[mid]: hi = mid
        else: lo = mid+1
    return lo

题目

英文版

744. Find Smallest Letter Greater Than Target

Given a characters array letters that is sorted in non-decreasing order and a character target, return the smallest character in the array that is larger than target.

Note that the letters wrap around.

  • For example, if target == 'z' and letters == ['a', 'b'], the answer is 'a'.

Example 1:

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

Example 2:

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

Example 3:

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

Constraints:

  • 2 <= letters.length <= 104
  • letters[i] is a lowercase English letter.
  • letters is sorted in non-decreasing order.
  • letters contains at least two different characters.
  • target is a lowercase English letter.

中文版

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

给你一个排序后的字符列表 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"

提示:

  • 2 <= letters.length <= 104
  • letters[i] 是一个小写字母
  • letters 按非递减顺序排序
  • letters 最少包含两个不同的字母
  • target 是一个小写字母
posted @ 2022-04-03 10:06  楠少科技  阅读(18)  评论(0编辑  收藏  举报