力扣744:寻找比目标字母大的最小字母; LeetCode744:Find Smallest Letter Greater Than Target
题目见文末
思路及题解
手写二分
源码:
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
解析
刚开始想到的就是二分查找,在查找之前,先排除两种情况:
- 列表首位元素满足要求,返回该元素,程序结束。
- 列表末位元素也不满足要求,返回首位元素,程序结束。
然后开始二分查找。
使用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 order
,the 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'
andletters == ['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
是一个小写字母
个人博客: | https://blog.nanshaobit.top |
CSDN: | https://blog.csdn.net/LZ_nanshao |
码云: | https://gitee.com/nanshaobit |
Github: | https://github.com/nanshaobit |