熱題系列章節7

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

題目描述:
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

示例:

現有矩陣 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
由于存在矩陣每行和每列的數據都是遞增的,所以我們可以從最小的元素所在的位置或是最大的元素所在的位置,即二維數組的左下角或是右上角開始查找。若當前位置的元素小于查找的數時,行數加1;否則列數加1。如下所示:

下三角尋找:

class Solution:def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:if matrix is None or matrix == []: return Falserows, cols = len(matrix), len(matrix[0])row, col = rows - 1, 0while row >= 0 and col <= cols - 1:if matrix[row][col] == target:return Trueelif matrix[row][col] > target:row -= 1else:col += 1return False

上三角尋找:


class Solution:def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:if matrix is None or matrix == []: return Falserows, cols = len(matrix), len(matrix[0])row, col = 0, cols - 1while col >= 0 and row <= rows - 1:if matrix[row][col] == target:return Trueelif matrix[row][col] < target:row += 1else:col -= 1return False

440. 字典序的第K小數字

給定整數 n 和 k,找到 1 到 n 中字典序第 k 小的數字。

示例 :
輸入:
n: 13 k: 2

輸出:
10

解釋:
字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的數字是 10。

補充題2. 圓環回原點問題

91. 解碼方法

一條包含字母 A-Z 的消息通過以下方式進行了編碼:

‘A’ -> 1
‘B’ -> 2

‘Z’ -> 26
給定一個只包含數字的非空字符串,請計算解碼方法的總數。

示例 1:
輸入: “12”
輸出: 2
解釋: 它可以解碼為 “AB”(1 2)或者 “L”(12)。

示例 2:
輸入: “226”
輸出: 3
解釋: 它可以解碼為 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。

dp[i]表示到第i-1位時解碼的方法數
兩種情況:
1.s[i-1]單獨解碼,方法數為dp[i-1]
2.s[i-2:i]拼接成雙字符解碼,若10<=s[i-2:i]<26,雙字符合格,解碼的方法數位dp[i-2],否則為0
綜合兩種情況,得到狀態轉移矩陣:
dp[i] = dp[i-1] + (dp[i-2] if 雙字符合格 else 0)

為什么dp[i]表示的使i-1位?
例如 216,在判斷第二位‘1’時,i-2<0了,狀態轉移矩陣不能用了,故在前加一位,即dp[0]為1

class Solution(object):def numDecodings(self, s):""":type s: str:rtype: int"""n = len(s)dp = [0]*(n+1)dp[0] = 1dp[1] = 1 if s[0]!='0' else 0for i in range(2,n+1):if s[i-1]!='0':dp[i] = dp[i-1]if 9< int(s[i-2:i])<27:dp[i] += dp[i-2]return dp[-1]

230. 二叉搜索樹中第K小的元素

給定一個二叉搜索樹,編寫一個函數 kthSmallest 來查找其中第 k 個最小的元素。

說明:
你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜索樹元素個數。

示例 1:

輸入: root = [3,1,4,null,2], k = 1

   3/ \1   4\2

輸出: 1
示例 2:

輸入: root = [5,3,6,2,4,null,null,1], k = 3

       5/ \3   6/ \2   4/1

輸出: 3

代碼

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def kthSmallest(self, root, k):""":type root: TreeNode:type k: int:rtype: int"""inorder = list()self.inorderTra(root, inorder)print inorderreturn inorder[k-1]def inorderTra(self, node, path):if not node:return self.inorderTra(node.left, path)path.append(node.val)self.inorderTra(node.right, path)

572. 另一個樹的子樹

給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。

示例 1:
給定的樹 s:

     3/ \4   5/ \1   2

給定的樹 t:

   4 / \1   2

返回 true,因為 t 與 s 的一個子樹擁有相同的結構和節點值。

示例 2:
給定的樹 s:

     3/ \4   5/ \1   2/0

給定的樹 t:

   4/ \1   2

返回 false。

思路:深度優先搜索

在這里,先分析題意:

一個二叉樹若為另一個樹的子樹,則它含有與另外一個樹的子樹相同結構和節點值。
根據示例 2 可知,判斷是否為子樹,必須有完全相同結構和節點值。
以下 s、t 表示兩個二叉樹,題目要求判斷 t 是否是 s 的子樹
現在將題意轉換為可實現代碼書寫的思路,判斷兩個樹是否相等,那么下面的條件必須同時成立:

當前兩個樹根節點值相同;
s 的左子樹與 t 的左子樹相同;
s 的右子樹與 t 的右子樹相同。
根據上面的思路,本篇幅考慮使用深度優化搜索的方法,枚舉 s 的每個節點,判斷這個點的子樹是否與 t 相等。使用深度優先搜索檢查,從根出發,同步移動遍歷兩個樹,判斷相應的位置是否相等。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:return self.dfs(s, t)def dfs(self, c, t):# c 子樹為空時,返回 Falseif not c:return Falsereturn self.is_same(c, t) or self.dfs(c.left, t) or self.dfs(c.right, t)def is_same(self, c, t):# 兩個樹都為空時,也認為是相同if (not c) and (not t):return True# 當其中一個樹為空,但另外一個樹不為空時,此時則為不同if (not c and t) or (c and not t):return False# 兩個樹都不為空,若值不同,也為不同if (c.val != t.val):return False# 上面的情況都不符合時,繼續向下檢查return self.is_same(c.left, t.left) and self.is_same(c.right, t.right)

114. 二叉樹展開為鏈表

在這里插入圖片描述

# 遞歸
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def flatten(self, root: TreeNode) -> None:"""Do not return anything, modify root in-place instead."""def unflod(node):if not node:return Noneunflod(node.left)unflod(node.right)# 后序遍歷if node.left:pre = node.left# 找到左子樹的最右子節點,用以連接根的右子樹while pre.right:pre = pre.right# 當找到左子樹的最右子節點,令其指向根的右子樹pre.right = node.right# 然后令根的右子樹指向根的左子樹,令根的左子樹為空node.right = node.leftnode.left = None# 循環node = node.rightunflod(root)# 非遞歸
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def flatten(self, root: TreeNode) -> None:"""Do not return anything, modify root in-place instead."""while root:if root.left:pre_node = root.left# 同樣先找到左子樹的最右節點while pre_node.right:pre_node = pre_node.right# 最右節點指向根節點的右子樹pre_node.right = root.right# 根的右子樹指向根的左子樹,同時置空左子樹root.right = root.leftroot.left = Noneroot = root.right

劍指 Offer 62. 圓圈中最后剩下的數字

445. 兩數相加 II

在這里插入圖片描述

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverse(self, head):   # 鏈表反轉pre = headcur = head.nextpre.next = Nonewhile cur:tmp = cur.nextcur.next = prepre = curcur = tmpreturn predef addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:l1 = self.reverse(l1)l2 = self.reverse(l2)h = ListNode((l1.val + l2.val) % 10)   # 額外記下頭結點,方便后續反轉鏈表flag = (l1.val + l2.val) // 10p = hl1 = l1.nextl2 = l2.nextwhile l1 or l2 or flag:if l1 and l2:node = ListNode((l1.val + l2.val + flag) % 10)flag = (l1.val + l2.val + flag) // 10l1 = l1.nextl2 = l2.nextelif l1:node = ListNode((l1.val + flag) % 10)flag = (l1.val + flag) // 10l1 = l1.nextelif l2:node = ListNode((l2.val + flag) % 10)flag = (l2.val + flag) // 10l2 = l2.nextelif flag:node = ListNode(flag)flag = 0p.next = nodep = nodereturn self.reverse(h)

295. 數據流的中位數

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

9. 回文數

給你一個整數 x ,如果 x 是一個回文整數,返回 true ;否則,返回 false 。

回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

例如,121 是回文,而 123 不是
輸入:x = 121
輸出:true

輸入:x = -121
輸出:false
解釋:從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個回文數。

輸入:x = 10
輸出:false
解釋:從右向左讀, 為 01 。因此它不是一個回文數

def isPalindrome(x: int) -> bool:"""不滿足進階要求"""if x < 0:return Falseif 0 <= x <= 9:return Trueif x % 10 == 0:return Falserev_x = int(''.join(list(str(x))[::-1]))if rev_x == x:return Trueelse:return False

384. 打亂數組

208. 實現 Trie (前綴樹)

328. 奇偶鏈表

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38335.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38335.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38335.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go 語言環境搭建

本篇文章為Go語言環境搭建及下載編譯器后配置Git終端方法。 目錄 安裝GO語言SDK Window環境安裝 下載 安裝測試 安裝編輯器 下載編譯器 設置git終端方法 總結 安裝GO語言SDK Window環境安裝 網站 Go下載 - Go語言中文網 - Golang中文社區 還有 All releases - The…

策略模式在金融業務中的應用及其框架實現

引言 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為設計模式&#xff0c;它允許在不修改客戶端代碼的情況下&#xff0c;動態地改變一個類的行為。它通過定義一系列算法并將它們封裝在獨立的策略類中&#xff0c;使這些算法可以互相替換&#xff0c;而不會影響…

Spark Cache 的用武之地

在什么情況下適合使用 Cache 我建議你在做決策的時候遵循以下 2 條基本原則&#xff1a; 如果 RDD/DataFrame/Dataset 在應用中的引用次數為 1&#xff0c;就堅決不使用 Cache如果引用次數大于 1&#xff0c;且運行成本占比超過 30%&#xff0c;應當考慮啟用 Cache第一條很好…

各維度卷積神經網絡內容收錄

各維度卷積神經網絡內容收錄 卷積神經網絡&#xff08;CNN&#xff09;&#xff0c;通常是指用于圖像分類的2D CNN。但是&#xff0c;現實世界中還使用了其他兩種類型的卷積神經網絡&#xff0c;即1D CNN和3D CNN。 在1D CNN中&#xff0c;內核沿1個方向移動。1D CNN的輸入和…

高通Android 12 /13根據包名授權懸浮窗權限

代碼路徑frameworks/base/service/core/com/android/server/policy/PhoneWindowManager.java 1、 PhoneWindowManager.java中關于根據包名實現懸浮窗權限授權的功能實現 在實現根據包名授予懸浮窗權限的核心的功能開發中&#xff0c;在通過上述的功能原理實現的過程中分析得知…

EigenLayer 生態解析-再質押與 AVS 崛起

基于以太坊網絡的再質押協議 EigenLayer 提出了利用為以太坊網絡驗證而質押的 ETH 來與其他協議共享安全性和資本效率,同時為協議參與者提供額外利息。在 AVS、再質押、積分系統等概念的推動下,逐漸形成一個龐大的生態系統,從 2024 年初到現在 EigenLayer 的 TVL 增加了 12 …

5.Spring IOC 循環依賴問題源碼深度剖析

Spring IOC 容器解決循環依賴問題主要涉及到幾個關鍵的緩存和對象創建過程中的處理邏輯。以下是對循環依賴問題進行深度剖析的概述&#xff1a; 循環依賴的背景 循環依賴發生在兩個或多個Bean相互依賴對方&#xff0c;形成一個閉環。這可能是直接的&#xff0c;比如Bean A依賴B…

全球最大智能立體書庫|北京:3萬貨位,715萬冊,自動出庫、分揀、搬運

導語 大家好&#xff0c;我是社長&#xff0c;老K。專注分享智能制造和智能倉儲物流等內容。 新書《智能物流系統構成與技術實踐》 北京城市圖書館的立體書庫采用了先進的WMS&#xff08;倉庫管理系統&#xff09;和WCS&#xff08;倉庫控制系統&#xff09;&#xff0c;與圖書…

Linux磁盤監控思路分析

磁盤監控原理 設備又名I/O設備&#xff0c;泛指計算機系統中除主機以外的所有外部設備。 1.1 計算機分類 1.1.1 按照信息傳輸速度分&#xff1a; 1.低速設備&#xff1a;每秒傳輸信息僅幾個字節或者百個字節&#xff0c;如&#xff1a;鍵盤、鼠標等 2.中速設備&#xff1a…

leetCode.98. 驗證二叉搜索樹

leetCode.98. 驗證二叉搜索樹 題目描述 代碼 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(n…

100張linux C/C++工程師面試高質量圖

文章目錄 雜項BIOSlinux開機啟動流程內核啟動流程網絡編程網絡編程流程tcp狀態機三次握手四次斷開reactor模型proactor模型select原理poll原理epoll原理文件系統虛擬文件系統文件系統調用阻塞IO非阻塞IO異步IO同步阻塞同步非阻塞IO多路復用進程管理進程狀態程序加載內存管理MMU…

力扣(2024.06.30)

1. 81——搜索旋轉排序數組2 已知存在一個按非降序排列的整數數組 nums &#xff0c;數組中的值不必互不相同。 在傳遞給函數之前&#xff0c;nums 在預先未知的某個下標 k&#xff08;0 < k < nums.length&#xff09;上進行了旋轉&#xff0c;使數組變為 [nums[k], n…

vue響應式原理細節分享

在講解之前&#xff0c;我們先了解一下數據響應式是什么&#xff1f;所謂數據響應式就是建立響應式數據與依賴&#xff08;調用了響應式數據的操作&#xff09;之間的關系&#xff0c;當響應式數據發生變化時&#xff0c;可以通知那些使用了這些響應式數據的依賴操作進行相關更…

前端:多服務端接口資源整合與zip打包下載

項目需求 前端項目開發中,有一個頁面需要去整合多個服務接口返回的數據資源,并且需要將這多個服務接口接口返回的數據進行資源壓縮,最終打包成zip壓縮包,并在客戶端完成下載。 基本需求梳理如下, 實現思路 這個需求點其實本質上還是傳統的“文件下載”功能需求,常見的例如…

Python使用defaultdict簡化值為list的字典

原始代碼&#xff1a; from typing import Dictrelated_objects_for_fetch: Dict[str, list] {}for key, value in [(k1, v1), (k1, v2), (k2, v2), (k3, v3), (k2, v2)]:if key not in related_objects_for_fetch:related_objects_for_fetch[key] []if value not in (value…

貪心問題(POJ1700/1017/1065)(C++)

一、貪心問題 貪心算法 貪心算法&#xff08;greedy algorithm&#xff09;&#xff0c;是用計算機來模擬一個「貪心」的人做出決策的過程。這個人十分貪婪&#xff0c;每一步行動總是按某種指標選取最優的操作。而且他目光短淺&#xff0c;總是只看眼前&#xff0c;并不考慮…

第三天:LINK3D核心原理講解【第1部分】

第三天:LINK3D核心原理講解 LINK3D學習筆記 目標 了解LINK3D velodyne64線激光雷達LINK3D質心點提取效果: 分布在車道與墻體的交界處。 課程內容 LINK3D論文精講LINK3D聚合關鍵點提取代碼講解LINK3D描述子匹配代碼講解除了ALOAM的線特征、面特征,還有其他點云特征嗎,是…

如何使用 Postgres 折疊您的堆棧 實現一切#postgresql認證

技術蔓延如何蔓延 假設您正在開發一款新產品或新功能。一開始&#xff0c;您的團隊會列出需要解決的技術問題。有些解決方案您將自行開發&#xff08;您的秘訣&#xff09;&#xff0c;而其他解決方案您將使用現有技術&#xff08;可能至少包括一個數據庫&#xff09;來解決。…

人工智能期末復習筆記(更新中)

分類問題 分類&#xff1a;根據已知樣本的某些特征&#xff0c;判斷一個新的樣本屬于哪種已知的樣本類 垃圾分類、圖像分類 怎么解決分類問題 分類和回歸的區別 1. 邏輯回歸分類 用于解決分類問題的一種模型。根據數據特征或屬性&#xff0c;計算其歸屬于某一類別 的概率P,…

ComfyUI局部重繪的四種方式 (附件工作流在最后)

前言 局部重繪需要在圖片中選擇重繪區域&#xff0c;點擊圖片右擊選擇Open in MaskEditor&#xff08;在蒙版編輯器中打開&#xff09;&#xff0c;用鼠標描繪出需要重繪的區域 方式一&#xff1a;重繪編碼器 這種方式重繪比較生硬&#xff0c;需要額外搭配使用才行 方式二&…