劍指 offer- Python 版本

劍指 Offer 03. 數組中重復的數字

題目

image.png

代碼詳情

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        nums_set = set() 
        for i in nums:
            if i not in nums_set:
                nums_set.add(i) 
            else:
                return i
            

劍指 Offer 04. 二維數組中的查找

題目

image.png

代碼詳情

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        row = len(matrix)
        if row <= 0:
            return False
        col = len(matrix[0]) 

        r = 0 
        c = col-1
        while r < row and c >= 0:
            if matrix[r][c] > target:
                c -= 1 
            elif matrix[r][c] < target:
                r += 1  
            else :
                return True
        return False 

劍指 Offer 06. 從尾到頭打印鏈表

題目

image.png

代碼詳情

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        res = [] 
        pHead = head 

        stack = [] 
        while pHead is not None:
            stack.insert(0, pHead.val)
            pHead = pHead.next 
        return stack

劍指 Offer 07. 重建二叉樹

題目

image.png

代碼詳情

# 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 len(preorder) <= 0 or len(inorder) <= 0:
            return None 
        root = TreeNode(preorder[0]) 
        i = inorder.index(preorder[0]) 
        root.left = self.buildTree(preorder[1:i+1], inorder[:i])
        root.right = self.buildTree(preorder[i+1:], inorder[i+1:])

        return root 

劍指 Offer 09. 用兩個棧實現隊列

題目

image.png

代碼詳情

class CQueue:

    def __init__(self):
        self.stack1 = []
        self.stack2 = [] 

    def appendTail(self, value: int) -> None:
        self.stack1.append(value)

    def deleteHead(self) -> int:
        if len(self.stack2) <= 0:
            if len(self.stack1) <= 0:
                return -1
            else:
                while self.stack1:
                    self.stack2.append(self.stack1.pop()) 
                
                return self.stack2.pop() 
        else:
            return self.stack2.pop() 

# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()

劍指 Offer 10- I. 斐波那契數列

題目

image.png

代碼詳情

# 非遞歸形式 
class Solution:
    def fib(self, n: int) -> int:
        a, b = 0, 1
        while n > 0:
            a, b = b, a + b
            n -= 1
        return a % 1000000007

劍指 Offer 10- II. 青蛙跳臺階問題

題目

image.png

代碼詳情

class Solution:
    def numWays(self, n: int) -> int:
        a, b = 1, 1
        while n > 0:
            a, b = b, a + b
            n -= 1
        return a % 1000000007

劍指 Offer 11. 旋轉數組的最小數字

題目

image.png

代碼詳情

class Solution:
    def minArray(self, numbers: List[int]) -> int:
        l = 0 
        r = len(numbers) -1

        while l < r:
            m = (l + r) // 2 
            if numbers[m] > numbers[r]:
                l = m + 1
            elif numbers[m] < numbers[r]:
                r = m 
            else:
                r = r - 1
        return numbers[l]

劍指 Offer 12. 矩陣中的路徑

題目

image.png

代碼詳情

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        def dfs(row, col, k):
            if not (0 <= row < len(board)) or not (0 <= col < len(board[0])) or board[row][col] != word[k]:
                return False
        
            if k == len(word) -1:
                return True
            tmp, board[row][col] = board[row][col], "/"
            res = dfs(row + 1, col, k +1 ) or dfs(row -1, col, k +1) or dfs(row, col + 1, k+1) or dfs(row, col - 1, k +1) 
            board[row][col] = tmp

            return res
        for i in range(len(board)):
            for j in range(len(board[0])):
                if (dfs(i, j, 0)):
                    return True 
        return False 

劍指 Offer 13. 機器人的運動范圍

題目

image.png

代碼詳情

class Solution {
    public int movingCount(int m, int n, int k) {
    //臨時變量visited記錄格子是否被訪問過
        boolean[][] visited = new boolean[m][n];
        return dfs(0, 0, m, n, k, visited);
    }

    public int dfs(int i, int j, int m, int n, int k, boolean[][] visited) {
        //i >= m || j >= n是邊界條件的判斷,k < sum(i, j)判斷當前格子坐標是否
        // 滿足條件,visited[i][j]判斷這個格子是否被訪問過
        if (i >= m || j >= n || k < sum(i, j) || visited[i][j])
            return 0;
        //標注這個格子被訪問過
        visited[i][j] = true;
        //沿著當前格子的右邊和下邊繼續訪問
        return 1 + dfs(i + 1, j, m, n, k, visited) + dfs(i, j + 1, m, n, k, visited);
    }

    //計算兩個坐標數字的和
    private int sum(int i, int j) {
        int sum = 0;
        while (i != 0) {
            sum += i % 10;
            i /= 10;
        }
        while (j != 0) {
            sum += j % 10;
            j /= 10;
        }
        return sum;
    }
}

劍指 Offer 14- I. 剪繩子

題目

image.png

代碼詳情


劍指 Offer 18. 刪除鏈表的節點

題目

image.png

代碼詳情

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def deleteNode(self, head: ListNode, val: int) -> ListNode:

        myHead = ListNode(0)
        myHead.next = head 
        pre = myHead
        p = head

        while p:
            if p.val == val:
                pre.next = p.next
                break
            else:
                pre = p 
                p = p.next
        return myHead.next

劍指 Offer 21. 調整數組順序使奇數位于偶數前面

題目

image.png

代碼詳情

class Solution:
    def exchange(self, nums: List[int]) -> List[int]:
        if len(nums) <= 1:
            return nums 
        left = 0 
        right = len(nums) - 1 

        key = nums[right] 
        while left < right:
            while left < right and nums[left] % 2 != 0:
                left += 1 
            nums[right] = nums[left] 
            while left < right and nums[right] % 2 == 0:
                right -= 1 
            nums[left] = nums[right] 
        nums[left] = key 
        return nums

劍指 Offer 22. 鏈表中倒數第k個節點

題目

image.png

代碼詳情

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
        first = head 
        second = head 

        while k > 0 and first:
            first = first.next 
            k -= 1 
        
        while first:
            first = first.next 
            second = second.next 
        return second

劍指 Offer 24. 反轉鏈表

題目

image.png

代碼詳情

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        p = head 

        pre = None 
        while p:
            tmp = p.next 
            p.next = pre 
            pre = p 
            p = tmp
        return pre

劍指 Offer 25. 合并兩個排序的鏈表

題目

image.png

代碼詳情

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        cur = myHead = ListNode(0)
        while l1 and l2:
            if l1.val < l2.val:
                cur.next, l1 = l1, l1.next
            else:
                cur.next, l2 = l2, l2.next
            cur = cur.next
        cur.next = l1 if l1 else l2
        return myHead.next

劍指 Offer 26. 樹的子結構

題目

image.png

代碼詳情

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

class Solution:
    def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
        if not B:
            return False 
        if not A:
            return False 
        if A.val == B.val and self.test(A.left, B.left) and self.test(A.right, B.right):
            return True 
        return self.isSubStructure(A.left, B) or self.isSubStructure(A.right, B)

    def test(self, a, b):
        if not b:
            return True 
        if not a or a.val != b.val:
            return False 
        return self.test(a.left, b.left) and self.test(a.right, b.right)
        

劍指 Offer 27. 二叉樹的鏡像

題目

image.png

代碼詳情

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

class Solution:
    def mirrorTree(self, root: TreeNode) -> TreeNode:
        if root is None:
            return None
        
        p = root 

        p.left, p.right = p.right, p.left 
        self.mirrorTree(p.left)
        self.mirrorTree(p.right)

        return root 

劍指 Offer 28. 對稱的二叉樹

題目

image.png

代碼詳情

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

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True 
        return self.test(root.left, root.right)
        

    def test(self, left, right):
        if left is None and right is None:
            return True 
        if left is None or right is None or left.val != right.val:
            return False 
        return self.test(left.left, right.right) and self.test(left.right, right.left) 

劍指 Offer 29. 順時針打印矩陣

題目

image.png

代碼詳情

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix: return []
        # 標志上下左右的邊界
        l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
        while True:
            for i in range(l, r + 1): res.append(matrix[t][i]) # left to right
            t += 1
            if t > b: break
            for i in range(t, b + 1): res.append(matrix[i][r]) # top to bottom
            r -= 1
            if l > r: break
            for i in range(r, l - 1, -1): res.append(matrix[b][i]) # right to left
            b -= 1
            if t > b: break
            for i in range(b, t - 1, -1): res.append(matrix[i][l]) # bottom to top
            l += 1
            if l > r: break
        return res

劍指 Offer 31. 棧的壓入、彈出序列

題目

image.png

代碼詳情

class Solution:
    def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
        tmp = []
        for i in range(len(pushed)):
            tmp.append(pushed[i])
            while len(popped) > 0 and len(tmp) > 0 and popped[0] == tmp[-1]:
                tmp.pop()
                popped.pop(0)
        return len(tmp) == 0

劍指 Offer 32 - I. 從上到下打印二叉樹

題目

image.png

代碼詳情

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

class Solution:
    def levelOrder(self, root: TreeNode) -> List[int]:
        if root is None:
            return []

        queue = [root] 
        res = [] 
        
        while queue:
            node = queue.pop(0)
            res.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        return res

劍指 Offer 32 - II. 從上到下打印二叉樹 II

題目

image.png

代碼詳情

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

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if root is None:
            return []
        queue = [root] 
        res = []
        while queue:
            tmp = []
            for i in range(len(queue)):
                node = queue.pop(0) 
                tmp.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right) 
            res.append(tmp) 
        return res 

劍指 Offer 33. 二叉搜索樹的后序遍歷序列

題目

image.png

代碼詳情

class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        if not postorder:
            return True 
        root = postorder[-1]
        for i in range(len(postorder)):
            if postorder[i] > root:
                break
        for j in range(i, len(postorder) - 1):
            if postorder[j] < root:
                return False 
        left = right = True 
        if i > 0:
            left = self.verifyPostorder(postorder[:i]) 
        if i < len(postorder) -1:
            right = self.verifyPostorder(postorder[i:len(postorder) -1])
        return left and right  

劍指 Offer 34. 二叉樹中和為某一值的路徑

題目

image.png

代碼詳情

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

class Solution:
    def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
        if root is None:
            return []
        if root is not None and root.left is None and root.right is None and root.val == sum:
            return [[root.val]]  

        left = self.pathSum(root.left, sum - root.val) 
        right = self.pathSum(root.right, sum - root.val) 

        res = [] 
        for i in left + right:
            res.append([root.val] + i) 
        return res 

劍指 Offer 40. 最小的k個數

題目

image.png

代碼詳情

劍指 Offer 42. 連續子數組的最大和

題目

image.png

代碼詳情

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        if not nums:
            return 0
        # 動態規劃,填充數據,dp[i]代表前一個數字的最大連續和
        dp = [0 for _ in range(len(nums))] 
        dp[0] = nums[0]
        for i in range(1, len(nums)):
            if dp[i - 1] > 0:
                dp[i] = dp[i - 1] + nums[i]
            else:
                dp[i] = nums[i]
        print(dp)

        return max(dp)

劍指 Offer 48. 最長不含重復字符的子字符串

題目

image.png

代碼詳情

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        tmp_dict = {} 
        i = -1 
        res = 0 
        tmp = 0 
        for j in range(len(s)):
            i = max(tmp_dict.get(s[j], -1), i) 
            tmp_dict[s[j]] = j 

            tmp = tmp + 1 if tmp < j -i else j -i 

            res = max(res, tmp)
        return res 

劍指 Offer 54. 二叉搜索樹的第k大節點

題目

image.png

代碼詳情

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

class Solution:
    def kthLargest(self, root: TreeNode, k: int) -> int:
        if root is None:
            return None 
        tmp = []
        self.test(root, tmp) 
        return tmp[k-1]

    
    def test(self, root, tmp):
        if root is None:
            return 
        self.test(root.right, tmp)
        tmp.append(root.val) 
        self.test(root.left, tmp)

劍指 Offer 55 - I. 二叉樹的深度

題目

image.png

代碼詳情

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

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if root is None:
            return 0
        left = self.maxDepth(root.left)
        right = self.maxDepth(root.right) 

        return (left if left > right else right) + 1

劍指 Offer 55 - II. 平衡二叉樹

題目

image.png

代碼詳情

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

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        def recur(root):
            if root is None: 
                return 0
            left = recur(root.left)
            if left == -1: 
                return -1
            right = recur(root.right)
            if right == -1: 
                return -1
            return max(left, right) + 1 if abs(left - right) <= 1 else -1

        return recur(root) != -1

劍指 Offer 56 - I. 數組中數字出現的次數

題目

image.png

代碼詳情

class Solution:
    def singleNumbers(self, nums: List[int]) -> List[int]:
        tmp = {} 
        for i in nums:
            if i not in tmp:
                tmp[i] = 0 
            tmp[i] += 1
        res = []
        for k, v in tmp.items():
            if v == 1:
                res.append(k)
        return res 

劍指 Offer 57. 和為s的兩個數字

題目

image.png

代碼詳情

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        if not nums:
            return []
        i, j = 0, len(nums) -1 

        while i < j:
            tmp = nums[i] + nums[j] 
            if tmp > target:
                j -= 1 
            if tmp < target:
                i += 1 
            if tmp == target:
                return [nums[i], nums[j]]

劍指 Offer 57 - II. 和為s的連續正數序列

題目

image.png

代碼詳情

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容