Leetcode 016-最接近的三数之和,020-有效的括号,021-合并两个有序链表
016-最接近的三数之和
题目描述
- 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
提示:
- 3 <= nums.length <= 10^3
- -10^3 <= nums[i] <= 10^3
- -10^4 <= target <= 10^4
代码(python)
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
n = len(nums)
nums.sort() # 排序
ans = float('inf')
for first in range(n-2): # 枚举第一个元素
if first > 0 and nums[first] == nums[first-1]: continue # 保证first不会有重复
second, third = first + 1, n - 1
max_sum = nums[first] + nums[-2] + nums[-1]
min_sum = nums[first] + nums[first + 1] + nums[first + 2]
if max_sum <= target: # 最大的数
if abs(max_sum - target) < abs(ans - target):
ans = max_sum
continue
elif min_sum >= target: # 最小的数
if abs(min_sum - target) < abs(ans - target):
ans = min_sum
break
while second < third:
two_sum_target = target - nums[first]
s = nums[second] + nums[third]
if abs(s + nums[first] - target) < abs(ans - target):
ans = s + nums[first]
if s > two_sum_target: # 当前数值太大 右指针左移
third -= 1
while third > second and nums[third] == nums[third + 1]:
third -= 1
elif s < two_sum_target: # 当前数值太小 左指针右移
second += 1
while third > second and nums[second] == nums[second - 1]:
second += 1
else: # 刚好等于 直接返回target即可
return target
return ans
020-有效的括号
题目描述
- 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
- 有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
注意
- 空字符串可被认为是有效字符串。
代码(python)
class Solution:
def isValid(self, s: str) -> bool:
dic = {'{': '}', '[': ']', '(': ')', '?': '?'}
stack = ['?']
for c in s:
if c in dic: stack.append(c)
elif dic[stack.pop()] != c: return False
return len(stack) == 1
021-合并两个有序链表
题目描述
- 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
提示:
- 两个链表的节点数目范围是 [0, 50]
- -100 <= Node.val <= 100
- l1 和 l2 均按 非递减顺序 排列
代码(python)
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
prev = prehead = ListNode(-1)
while l1 and l2:
if l1.val <= l2.val:
prev.next = l1
l1 = l1.next
else:
prev.next = l2
l2 = l2.next
prev = prev.next
prev.next = l1 if l1 else l2
return prehead.next