分治、递归算法专题 (II):Leetcode 17 电话号码的字母组合 + Leetcode 34 在排序数组中查找元素的第一个和最后一个位置
Leetcode 17 电话号码的字母组合
题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
题解
时间复杂度无论如何都是 O ( 2 N ) O(2^N) O(2N) 的,没有优化的算法。这里用递归的方法来解决。
长度为 N N N 的数字串的情况 = = = 长度 N − 1 N-1 N−1 的数字串 × \times × 最有一个字符对应的可能情况
代码如下:
class Solution(object):
def letterCombinations(self, digits):
dic = dict(zip(["2", "3", "4", "5", "6", "7", "8", "9"],
[["a", "b", "c"],
["d", "e", "f"],
["g", "h", "i"],
["j", "k", "l"],
["m", "n", "o"],
["p", "q", "r", "s"],
["t", "u", "v"],
["w", "x", "y", "z"]]))
def combine(dic, s):
if len(s) == 1:
return dic[s]
if len(s) > 1:
lst = combine(dic, s[:-1])
res = []
for i in range(0, len(lst)):
temp = []
for j in dic[s[-1]]:
temp.append(lst[i] + j)
res.extend(temp)
return res
if not digits:
return []
return combine(dic, digits)
执行结果
执行时间:16 ms
内存消耗:11.8 MB
Leetcode 34 在排序数组中查找元素的第一个和最后一个位置
题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
题解
没有特别的,用两分法,找到这个数值对应的位置,然后两个指针分别从左、从右找这个数值最后终止的位置,输出做右指针的位置即可。
代码如下:
class Solution(object):
def searchRange(self, nums, target):
if target not in nums:
return [-1, -1]
left = 0
right = len(nums)
if left == right:
return [0, 0]
while left < right:
mid = (left + right) // 2
if nums[mid] > target:
right = mid
elif nums[mid] < target:
left = mid
else:
break
left = right = mid
while left >= 0:
if nums[left] != target:
break
left = left - 1
while right < len(nums):
if nums[right] != target:
break
right = right + 1
return [left + 1, right - 1]
执行结果
执行时间:76 ms
内存消耗:13.1 MB