leetcode-4.30[112. 路徑總和、118. 楊輝三角、121. 買賣股票的最佳時機](python實現)

題目1

在這裏插入圖片描述

題解1

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def hasPathSum(self, root: TreeNode, sum: int) -> bool:
        # 邊界條件,如果爲None則返回flase
        if root is None:
            return False
        # 每次左右兩邊的遞歸分別用sum減去該值
        sum -= root.val
        # 返回左右節點不存在(葉子節點)的時sum是否剛好減完
        if not root.left and not root.right:
            return sum == 0
        # 最終結果有一個爲True,則證明有一條路徑可以正好等於sum
        return self.hasPathSum(root.left, sum) or self.hasPathSum(root.right, sum)

附上題目鏈接

題目2

在這裏插入圖片描述

題解2

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        res = []
        for i in range(numRows):
            # 根據每一行的個數給每個元素附上1
            now = [1]*(i+1)
            # 從第三行開始,才和上一層有關係
            if i >= 2:
                # 因爲每一行的兩端都爲1,所以遍歷每一行除去兩端的值
                for j in range(1,i):
                    # 將上一層的該下標左邊值加上一層該下標的值賦給該層該下標處
                    now[j] = pre[j-1] + pre[j]
            res += [now]
            # 保存上層值
            pre = now
        return res


    # 動態規劃
    def generate(self, num_rows):
        triangle = []

        for row_num in range(num_rows):
            # 初始化下一層
            row = [None for _ in range(row_num+1)]
            # 每一層的第一個元素和最後一個元素賦值1
            row[0], row[-1] = 1, 1
            # 重新給每一層的第1到i-1個元素賦值
            for j in range(1, len(row)-1):
                row[j] = triangle[row_num-1][j-1] + triangle[row_num-1][j]

            triangle.append(row)

        return triangle

附上題目鏈接

題目3

在這裏插入圖片描述

題解3

class Solution:
    # 分治算法
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        if n <= 1:
            return 0
        mid = n//2
        left = prices[:mid]
        right = prices[mid:]
        
        left_price = self.maxProfit(left)
        right_price = self.maxProfit(right)
        left_right_price = max(right) - min(left)
        return max(left_price, right_price, left_right_price)

    # 動態規劃
    def maxProfit(self, prices: List[int]) -> int:
        """
        input: [7,1,5,3,6,4]
        子問題:DP[i]爲到第i個元素時股票賺的最多
        子問題之間的關係: DP[i] = max(DP[i-1], A[i]- min_price]) 用min記錄下的到i個元素的最小值下標
        邊界條件: DP[0] = 0
        建表:  i  0  1  2  3  4  5
            A[i]  7  1  5  3  6  4
       min_price  7  1  1  1  1  1
            D[i]  0  0  4  4  5  5
        """
        n = len(prices)
        if n <= 0:
            return 0
        DP = [None]*n
        DP[0] = 0
        min_price = prices[0]
        for i in range(1,n):
            min_price = min(min_price, prices[i])
            DP[i] = max(DP[i-1],prices[i]-min_price)
            print(min_price)
        return max(DP)

附上題目鏈接

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