1. 程式人生 > 其它 >數學建模筆記001

數學建模筆記001

技術標籤:Coding 筆記連結串列資料結構

  1. 最接近的三數之和
    給定一個包括 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
  1. 有效的括號
    給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。

有效字串需滿足:

左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。

解題思路:
本題為一道簡單題,每一個左括號必定要有一個對應的右括號與之對應,因此正確的情況:

  1. 左括號必定先出現
  2. 而右括號每次出現則需要與最近的一個左括號進行匹配,若無法匹配則錯誤。
  3. 因此我們可以用兩個列表字典來分別儲存左括號和右括號
  4. 因為每次都需要取最近一個放入容器的左括號來進行匹配,這種先入後出的順序可以讓我們很容易想到 這種資料結構,因此我們把遇到的每一個左括號都依次壓入棧中,當遇到右括號時,則取出棧頂元素與之匹配判斷
  5. 最後判斷一次有無落單的左括號,若沒有落單的左括號則認為匹配成功。
    程式碼如下
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.合併兩個有序連結串列
將兩個升序連結串列合併為一個新的 升序 連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。

一道經典的連結串列題
主要注意點為每次斷鍵的連線。
解題思路:

  1. 採用三個遊標,兩個分別指向兩個連結串列頭部,一個用來臨時儲存斷點的下一個節點
  2. 每次取兩個遊標的對應值的較小值接在新連結串列的後面
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