數學建模筆記001
阿新 • • 發佈:2021-01-25
- 最接近的三數之和
給定一個包括 n 個整數的陣列 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
n = len(nums)
best = 10**7
# 根據差值的絕對值來更新答案
def update(cur):
nonlocal best
if abs(cur - target) < abs(best - target):
best = cur
# 列舉 a
for i in range(n):
# 保證和上一次列舉的元素不相等
if i > 0 and nums[i] == nums[i - 1]:
continue
# 使用雙指標列舉 b 和 c
j, k = i + 1, n - 1
while j < k:
s = nums[i] + nums[j] + nums[k]
# 如果和為 target 直接返回答案
if s == target:
return target
update(s)
if s > target:
# 如果和大於 target,移動 c 對應的指標
k0 = k - 1
# 移動到下一個不相等的元素
while j < k0 and nums[k0] == nums[k]:
k0 -= 1
k = k0
else:
# 如果和小於 target,移動 b 對應的指標
j0 = j + 1
# 移動到下一個不相等的元素
while j0 < k and nums[j0] == nums[j]:
j0 += 1
j = j0
return best
- 有效的括號
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
解題思路:
本題為一道簡單題,每一個左括號必定要有一個對應的右括號與之對應,因此正確的情況:
- 左括號必定先出現
- 而右括號每次出現則需要與最近的一個左括號進行匹配,若無法匹配則錯誤。
- 因此我們可以用兩個列表或字典來分別儲存左括號和右括號
- 因為每次都需要取最近一個放入容器的左括號來進行匹配,這種先入後出的順序可以讓我們很容易想到 棧 這種資料結構,因此我們把遇到的每一個左括號都依次壓入棧中,當遇到右括號時,則取出棧頂元素與之匹配判斷
- 最後判斷一次有無落單的左括號,若沒有落單的左括號則認為匹配成功。
程式碼如下
class Solution:
def isValid(self, s: str) -> bool:
if not str:return True
l = ['(','[','{']
r = [')',']','}']
stack = []
for x in s:
if x in l:
stack.append(x)
if x in r:
if not stack:
return False
elif stack.pop()!= l[r.index(x)]:
return False
if stack:return False
return True
21.合併兩個有序連結串列
將兩個升序連結串列合併為一個新的 升序 連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。
一道經典的連結串列題
主要注意點為每次斷鍵的連線。
解題思路:
- 採用三個遊標,兩個分別指向兩個連結串列頭部,一個用來臨時儲存斷點的下一個節點
- 每次取兩個遊標的對應值的較小值接在新連結串列的後面
class Solution:
def mergeTwoLists(self, l1, l2):
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