leetcode.100-200

  • 102 二叉樹的層序遍歷
    這道需要一層一層的遍歷二叉樹,我的思路在解決每層時需要一個隊列來存放本層的node個數,每次開始循環前先看隊列裏有幾個node,作爲彈出node的個數。
    py語法上犯了個錯,list1 is [], 用來判斷數值list1==[]並且id也要相同,is用來判斷是一個對象,這個bug是在IDE調試纔想到的。
class Solution:
    def levelOrder(self, root):
        if not root: return []
        rt = []
        stack = [root]
        while stack:
            n = len(stack)
            level_rt = []  # 每層node.val放入
            for i in range(n):  # 要直到本層循環需要彈出幾個node
                cur = stack.pop(0)
                if cur.val: level_rt.append(cur.val)
                if cur.left is not None:
                    stack.append(cur.left)
                if cur.right is not None:
                    # 節點不None入隊
                    stack.append(cur.right)
            rt.append(level_rt)
        return rt
給定有序數組: [-10,-3,0,5,9],一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:

      0
     / \
   -3   9
   /   /
 -10  5

思路是找到數組中間的點,使樹整體平衡,用遞歸思想解決:
先提起來中間的點,
然後中間點左邊數組去建左樹,
然後中間點右邊數組去建右樹,
每次遞歸時都是生層了新的數組,List[]生成新對象。

class Solution:
    def sortedArrayToBST(self, nums):
        if not nums : return None
        mid = len(nums)//2
        root = TreeNode(nums[mid])
        root.left = self.sortedArrayToBST(nums[:mid])
        root.right= self.sortedArrayToBST(nums[mid+1:])
        return root
  • 124 二叉樹中的最大路徑和
  • 在這裏插入圖片描述
    在這裏插入圖片描述
    圖片來自,也可以參考思想:樹的題一般用遞歸實現,最大路徑可能是二叉樹從左到右的任意路徑的和,所以是由多個局部最大組成全局最大路徑, 也可能不路過根節點,局部路徑最大。遞歸實現時候需要用一個緩存保存每次可能出現的路徑和。
class Solution:
    def maxPathSum(self, root):# TreeNode) -> int:
        ans = float("-inf")
        def helper(node):
            if not node: return 0
            left = max(0, helper(node.left))
            right = max(0, helper(node.right))
            nonlocal ans
             # 記錄可能出現的某個最大路徑
            ans = max(ans, node.val+left+right)
             # 返回左樹路徑或右樹中的大值
            return max(left, right) + node.val
        helper(root)
        return ans
  • 162 尋找峯值
    這道題思路很簡單,就是二分法查找合適的峯值數數
class Solution:
    def findPeakElement(self, nums):
        self.ls = nums
        if len(self.ls) == 1:  return 0# 單個元素
        self.rt = 0
        self.isPeak(0, len(self.ls)-1)
        return self.rt

    def isPeak(self, start, end):
        # 找到就返回
        idx = (start + end) // 2
        if start > end: return False
        if 0==idx and self.ls[idx]>self.ls[idx+1]: # 左邊界,
            self.rt = idx
            return True
        if idx==(len(self.ls)-1) and self.ls[idx]>self.ls[idx-1]: # 中間元素
            self.rt = idx
            return True
        if self.ls[idx-1] < self.ls[idx] > self.ls[idx+1]: # 右邊界
            self.rt = idx
            return True
        else:
            # 二分搜索
            self.isPeak(start, idx-1)
            self.isPeak(idx+1, end)

s = Solution()
print(s.findPeakElement([1,2,1,0]))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章