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

153 阅读1分钟

image.png

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

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 本题提供两个参数,letters 是小写字母列表,target 是小写字母
    • 要求在 letters 中找到比 target 字母临近的最大的字母
    • letters 和 target 都是小写字母
    • letters 列表里面按照递增排序的

二、思路分析:

我们拿到本题,直接无脑暴力求解,思路是这样的:

  • 遍历 letters 的字母,与 target 进行比较
  • 当 letters[i] 大于 target时,直接 return letter[i]
  • 当遍历完后,都没有找到时,则返回 letters[0]。因为在比较时,字母是依序循环出现的,当 target = "z", letters = ["a","b"],结果返回时 letter[0] == "a"。

本题使用暴力求解,python 代码也很容易的实现以上思路,代码如下:

for i in range(len(letters)): 
    if target < letters[i]: 
        return letters[i] 
return letters[0]

本题,除力暴力求解,还有其他方法吗?-- 答案是肯定的,二分法查找。

所谓二分法,就是对半比较,每一次比较就缩短范围。

  • 二分法需要定义两个指针,left、right分别指向列表的首尾的位置。
  • 求出left、right居中的位置mid
  • 当 letters[mid] 大于 target时,则right指针被赋值为mid值
  • 当 letters[mid] 小于等于target时,则left指针➕1

image.png

image.png

优化代码,二分法实现本题。代码如下:

class Solution(object):
    def nextGreatestLetter(self, letters, target):
        """
        :type letters: List[str]
        :type target: str
        :rtype: str
        """

        left = 0
        right = len(letters)-1

        while right > left:
            
            mid = (left + right)/2

            print(mid)

            if letters[mid] <= target:

                left = mid + 1
            else:
                right = mid

        if letters[right] <= target:

            return letters[0]
        else:
            return letters[left] 

三、总结:

本题,我们使用二分法和暴力求解,AC提交记录:

image.png

暴力求解:时间复杂度O(n),空间复杂度O(1)

二分法求解: 时间复杂度O(logn),空间复杂度O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~