一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 本题提供两个参数,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
优化代码,二分法实现本题。代码如下:
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提交记录:
暴力求解:时间复杂度O(n),空间复杂度O(1)
二分法求解: 时间复杂度O(logn),空间复杂度O(1)
以上是本期内容,欢迎大佬们点赞评论,下期见~~