16. 最接近的三数之和
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
思路:和三数之和相似 注意返回的是最接近的和
class Solution:
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
mindiff = abs(nums[0] + nums[1] + nums[2] - target)
result = nums[0] + nums[1] + nums[2]
for i in range(len(nums) - 2):
if i == 0 or nums[i] > nums[i - 1]:
left = i + 1
right = len(nums) - 1
while left < right:
sum = nums[i] + nums[left] + nums[right]
if sum == target:
mindiff = 0
return target
elif sum < target:
left += 1
if target - sum < mindiff:
mindiff = target - sum
result = sum
else:
right -= 1
if sum - target < mindiff:
mindiff = sum - target
result = sum
while left < right and nums[left] == nums[left-1]: # skip duplicates
left += 1
if right < len(nums) - 1:
while left < right and nums[right] == nums[right + 1]:
right -= 1
return result
17. 电话号码的字母组合
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
class Solution:
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if digits == "":
return []
dic = {2:'abc',3:'def',4:'ghi',5:'jkl',6:'mno',7:'pqrs',8:'tuv',9:'wxyz'}
a = ['']
for d in digits:
b = []
for i in dic[int(d)]:
for item in a:
item = item + i
b.append(item)
a = b
return a
18. 四数之和
给定一个包含 n 个整数的数组 nums
和一个目标值 target
,判断 nums
中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target
相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]
思路:与三数之和相似 先固定nums[i] 再固定nums[j] 再移动left right指针
注意去重
class Solution:
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
s = []
nums.sort()
for i in range(len(nums) - 3):
if i == 0 or nums[i] > nums[i - 1]:
for j in range(i + 1,len(nums) - 2):
if j == i + 1 or nums[j] > nums[j - 1]:#注意这里的去重
left = j + 1
right = len(nums) - 1
while left < right:
sum = nums[i] + nums[j] + nums[left] + nums[right]
if sum == target:
s.append([nums[i],nums[j],nums[left],nums[right]])
left += 1
right -= 1
while left < right and nums[left] == nums[left-1]: # skip duplicates
left += 1
if right < len(nums) - 1:
while left < right and nums[right] == nums[right + 1]:
right -= 1
elif sum < target:
left += 1
else:
right -= 1
return s