LeetCode-劍指Offer刷題記錄

qq_32110859發表於2020-12-29

這個部落格記錄leetcode-劍指offer中遇到問題的題目

劍指 Offer 04. 二維陣列中的查詢

在一個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個高效的函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
示例:
現有矩陣 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
給定 target = 5,返回 true。
給定 target = 20,返回 false。
限制:
0 <= n <= 1000
0 <= m <= 1000

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        if matrix == []:
            return False
        row = 0
        col = len(matrix[0]) - 1
        n = len(matrix)
        m = len(matrix[0])
        while -1 < row < n and -1 < col < m:
            if matrix[row][col] == target:
                return True
            elif matrix[row][col] > target:
                col -= 1
            else:
                row += 1
        return False

對於這樣的二維陣列,每一個數字的左邊和上邊的數字都比這個數字小。

劍指 Offer 07. 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
例如,給出
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
3
/
9 20
/
15 7

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

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if inorder == []:
            return None
        elif len(inorder) == 1: 
            return TreeNode(preorder[0])
        elif len(inorder) == 2:
            root = TreeNode(preorder[0])
            if preorder == inorder:
                root.right = TreeNode(preorder[-1])
            else:
                root.left = TreeNode(preorder[-1])
            return root
        else:
            root = TreeNode(preorder[0])
            ind = inorder.index(preorder[0])
            left_in = inorder[:ind]
            right_in = inorder[ind+1:]
            left_pre = preorder[1:1+len(left_in)]
            right_pre = preorder[-len(right_in):]
            root.left = self.buildTree(left_pre,left_in) if left_in != [] else None
            root.right = self.buildTree(right_pre,right_in) if right_in != [] else None
            return root

在前序遍歷中尋找左右子樹對應節點時,可以利用之前左右子樹中序遍歷節點長度生成。
leetoce解題方案

相關文章