16 - 最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
n = len(nums)
nums.sort()
ans = float('inf') #表示返回值,即最接近的三个数的和
for p1 in range(n):
p2, p3 = p1+1, n-1
while p2 < p3:
temp = nums[p1] + nums[p2] + nums[p3]
if abs(temp-target) < abs(ans-target):
ans = temp
if temp == target:
return target
elif temp > target:
p3 -= 1
else:
p2 += 1
return ans
这一题和最大容器那一题很像,和三数之和也很像。
使用排序加双指针可解。
20 - 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
class Solution:
def isValid(self, s: str) -> bool:
l = []
for i in range(len(s)):
l.append(s[i])
if s[i] == ')':
l.pop()
if not l:
return False
if l.pop() != '(':
return False
if s[i] == ']':
l.pop()
if not l:
return False
if l.pop() != '[':
return False
if s[i] == '}':
l.pop()
if not l:
return False
if l.pop() != '{':
return False
if not l:
return True
else:
return False
用栈,当碰到 ‘)’, ‘]’, ‘}’ 时,弹出该字符并判断下一个字符是否为 ‘(’, ‘[, ‘{’
但是需要注意第二次弹出时栈为空的情况,例如s=’]’
剑指Offer 25 / 21 - 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
head = ListNode(0)
rehead = head
while l1 and l2:
if l1.val < l2.val:
head.next = l1
l1 = l1.next
else:
head.next = l2
l2 = l2.next
head = head.next
head.next = l1 if l1 else l2
return rehead.next
这题走了不少弯路,我一直想的是改变l1或l2的结构和链接,但这样的话弯弯绕绕特别多。不如直接创建一个新的链表,然后l1和l2的值,谁的值更小就把新链表的head指向谁。最后注意一下l1和l2其中一个为None另一个不为None时的处理。用到了三元表示法【Python 三元表达式写法A if x else B
,代表当x=True
时执行A,否则执行B】