16. 最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
【思路】
与三数之和一致,将数列排序,固定一个点,另外两个点使用指针对撞法。
【实现】
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
res = sum(nums[:3])
for n in range(len(nums) - 2):
i, j = n+1, len(nums)-1
while i < j:
tmp = nums[n] + nums[i] + nums[j]
if abs(target - tmp) < abs(target - res):
res = tmp
if tmp == target:
return tmp
elif tmp > target:
j -= 1
else:
i += 1
return res
20. 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
【思路】
这也是一道很经典的编程题了,传统思路是遍历循环,右括号配对左括号,用一个列表储存配对的括号。巧妙的思路是,有效的括号必定存在一个完整的括号对,如“() ”,然后像剥洋葱一样层层去除,如果是有效的括号最后一定会剥完。
【实现】
# 传统方法
class Solution:
def isValid(self, s: str) -> bool:
hashmap = {'(': ')', '{': '}', '[': ']'}
tmp = []
for i in s:
if i not in hashmap:
if len(tmp) == 0 or i != tmp[-1]:
return False
else:
tmp.pop()
else:
tmp.append(hashmap.get(i))
return len(tmp) == 0
# 巧妙方法
class Solution:
def isValid(self, s: str) -> bool:
while '()' in s or '[]' in s or '{}' in s:
s = s.replace('()', '')
s = s.replace('[]', '')
s = s.replace('{}', '')
return len(s) == 0
21. 合并两个有序列表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
【思路】
看到这种链表题就头疼,数据结构掌握的太差了。大体有两种解法:递归&迭代。
【实现】
# 递归
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
# 边界条件
if l1 is None:
return l2
elif l2 is None:
return l1
# 递归
elif l1.val < l2.val:
l1.next = self.mergeTwoLists(l1.next, l2)
return l1
else:
l2.next = self.mergeTwoLists(l1, l2.next)
return l2
# 迭代
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
res = ListNode(None)
node = res
while l1 and l2:
if l1.val<l2.val:
node.next,l1 = l1,l1.next
else:
node.next,l2 = l2,l2.next
node = node.next
if l1:
node.next = l1
else:
node.next = l2
return res.next