經典算法題解析:從思路到實現,掌握核心編程思維

算法是編程的靈魂,也是面試中的重點考察內容。本文精選了幾道經典算法題,涵蓋字符串處理、鏈表操作、樹遍歷等常見場景,通過詳細解析幫助你理解算法設計思路與實現細節,提升解題能力。

一、無重復字符的最長子串

題目描述

給定一個字符串?s,請你找出其中不含有重復字符的最長子串的長度。

示例

  • 輸入:s = "abcabcbb"?→ 輸出:3(最長子串是?"abc"
  • 輸入:s = "bbbbb"?→ 輸出:1(最長子串是?"b"
  • 輸入:s = "pwwkew"?→ 輸出:3(最長子串是?"wke"

解題思路:滑動窗口 + 哈希表

滑動窗口是處理子串問題的高效方法,核心是維護一個動態窗口?[left, right],確保窗口內的字符無重復。配合哈希表記錄字符最后出現的位置,可快速調整窗口邊界。

代碼實現

def length_of_longest_substring(s):char_map = {}  # 記錄字符最后出現的位置left = 0       # 滑動窗口左邊界max_len = 0    # 最大長度for right in range(len(s)):current_char = s[right]# 若當前字符已存在且在窗口內,移動左邊界if current_char in char_map and char_map[current_char] >= left:left = char_map[current_char] + 1# 更新字符的最新位置char_map[current_char] = right# 計算當前窗口長度并更新最大值current_len = right - left + 1max_len = max(max_len, current_len)return max_len

詳細解析

  1. 核心變量

    • left?和?right?分別為窗口的左右邊界,初始時?left=0
    • char_map?存儲每個字符最后一次出現的索引,用于快速判斷重復。
    • max_len?記錄最長無重復子串的長度。
  2. 窗口調整邏輯

    • 遍歷字符串時,right?不斷右移,擴大窗口范圍。
    • 若當前字符?current_char?已在?char_map?中,且上次出現的位置在窗口內(char_map[current_char] >= left),說明出現重復,需將左邊界?left?移到上次出現位置的下一位(char_map[current_char] + 1),確保窗口內無重復。
    • 每次移動后,計算當前窗口長度(right - left + 1),并更新?max_len
  3. 復雜度分析

    • 時間復雜度:O (n),每個字符僅被遍歷一次。
    • 空間復雜度:O (min (n, m)),m?為字符集大小(如 ASCII 字符集為 256)。

二、合并兩個有序鏈表

題目描述

將兩個升序鏈表合并為一個新的升序鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。

示例
輸入:l1 = [1,2,4],?l2 = [1,3,4]
輸出:[1,1,2,3,4,4]

解題思路:遞歸法

遞歸是處理鏈表問題的常用思路,通過比較兩個鏈表的當前節點值,遞歸合并剩余節點,代碼簡潔直觀。

代碼實現

# 定義鏈表節點
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef merge_two_lists(l1, l2):# 若其中一個鏈表為空,直接返回另一個if not l1:return l2if not l2:return l1# 遞歸合并if l1.val <= l2.val:l1.next = merge_two_lists(l1.next, l2)return l1else:l2.next = merge_two_lists(l1, l2.next)return l2

詳細解析

  1. 遞歸終止條件

    • 若?l1?為空,返回?l2(空鏈表與非空鏈表合并結果為非空鏈表)。
    • 若?l2?為空,返回?l1,邏輯同上。
  2. 遞歸邏輯

    • 比較?l1.val?和?l2.val,選擇值較小的節點作為當前合并鏈表的節點。
    • 遞歸合并該節點的?next?指針與另一個鏈表,形成新的鏈表。
    • 返回當前選擇的節點,作為合并后鏈表的一部分。
  3. 示例驗證
    以?l1 = [1,2,4]?和?l2 = [1,3,4]?為例:

    • 比較?l1.val=1?和?l2.val=1,選擇?l1,遞歸合并?l1.next=[2,4]?與?l2=[1,3,4]
    • 后續步驟類似,最終合并結果為?[1,1,2,3,4,4]
  4. 復雜度分析

    • 時間復雜度:O (m + n),m?和?n?分別為兩鏈表長度,需遍歷所有節點。
    • 空間復雜度:O (m + n),遞歸棧深度最壞情況下為兩鏈表長度之和。

三、有效的括號

題目描述

給定一個只包括?'('')''{''}''['']'?的字符串?s,判斷字符串是否有效。有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。

示例

  • 輸入:s = "()"?→ 輸出:True
  • 輸入:s = "()[]{}"?→ 輸出:True
  • 輸入:s = "(]"?→ 輸出:False

解題思路:棧結構

棧的 “后進先出” 特性非常適合處理括號匹配問題:左括號入棧,右括號則彈出棧頂元素檢查是否匹配。

代碼實現

def is_valid(s):stack = []  # 存儲左括號的棧mapping = {')': '(', ']': '[', '}': '{'}  # 右括號到左括號的映射for char in s:# 若為右括號,檢查棧頂元素是否匹配if char in mapping:# 棧為空或棧頂元素不匹配,返回Falseif not stack or stack.pop() != mapping[char]:return False# 若為左括號,直接入棧else:stack.append(char)# 遍歷結束后,棧應為空return len(stack) == 0

詳細解析

  1. 棧與哈希表的配合

    • 棧?stack?用于存儲左括號,遇到左括號直接入棧。
    • 哈希表?mapping?存儲右括號到左括號的映射,方便快速查找匹配的左括號(如?')'?對應?'(')。
  2. 匹配邏輯

    • 遍歷字符串中的每個字符:
      • 若為右括號:
        • 若棧為空,說明沒有左括號與之匹配,返回?False
        • 彈出棧頂元素,若與當前右括號不匹配(如?')'?對應棧頂不是?'('),返回?False
      • 若為左括號,直接入棧。
    • 遍歷結束后,若棧不為空,說明存在未匹配的左括號,返回?False;否則返回?True
  3. 示例驗證
    輸入?s = "([)]"

    • 遍歷到?'(',入棧 → 棧:['(']
    • 遍歷到?'[',入棧 → 棧:['(', '[']
    • 遍歷到?')',棧頂為?'[',不匹配 → 返回?False
  4. 復雜度分析

    • 時間復雜度:O (n),遍歷字符串一次。
    • 空間復雜度:O (n),最壞情況下棧存儲所有左括號。

四、二叉樹的中序遍歷

題目描述

給定一個二叉樹的根節點?root,返回它的中序遍歷結果。(中序遍歷順序:左子樹 → 根節點 → 右子樹)

示例
輸入:root = [1,null,2,3](二叉樹結構:根節點 1,右子節點 2,2 的左子節點 3)
輸出:[1,3,2]

解題思路:遞歸法

遞歸是實現樹遍歷的直觀方法,中序遍歷的遞歸邏輯為:先遍歷左子樹,再訪問根節點,最后遍歷右子樹。

代碼實現

# 定義二叉樹節點
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef inorder_traversal(root):result = []def inorder(node):if node is None:return# 遞歸遍歷左子樹inorder(node.left)# 訪問根節點result.append(node.val)# 遞歸遍歷右子樹inorder(node.right)inorder(root)return result

詳細解析

  1. 遞歸函數設計

    • 輔助函數?inorder(node)?用于實現中序遍歷,參數為當前節點?node
    • 終止條件:若?node?為空,直接返回(空樹無需遍歷)。
  2. 遍歷順序

    • 遞歸遍歷左子樹:inorder(node.left),確保左子樹所有節點先于根節點被訪問。
    • 訪問根節點:將當前節點值加入結果列表?result
    • 遞歸遍歷右子樹:inorder(node.right),確保右子樹所有節點后于根節點被訪問。
  3. 示例驗證
    對于?root = [1,null,2,3]

    • 調用?inorder(1),先遍歷左子樹(為空),訪問?1?→?result = [1]
    • 遞歸遍歷右子樹?2,先遍歷其左子樹?3:訪問?3?→?result = [1,3]
    • 訪問?2?→?result = [1,3,2],最終返回?[1,3,2]
  4. 復雜度分析

    • 時間復雜度:O (n),遍歷所有節點一次。
    • 空間復雜度:O (h),h?為樹的高度,遞歸棧深度取決于樹高,最壞情況(鏈狀樹)為 O (n)。

總結

本文通過四道經典算法題,展示了滑動窗口、遞歸、棧等數據結構與算法的實際應用。解題的核心在于:

  1. 問題拆解:將復雜問題轉化為可通過特定數據結構或算法解決的子問題(如用棧處理括號匹配)。
  2. 邏輯設計:明確變量含義、邊界條件和處理流程(如滑動窗口中左右邊界的動態調整)。
  3. 復雜度優化:在實現功能的基礎上,考慮時間和空間效率(如用哈希表降低查找時間)

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

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

相關文章

【Unity游戲】——1.俄羅斯方塊

搭建場景 使用任意方塊、純色瓦片或者其他圖形作為背景&#xff0c;設置其大小與目標大小一致或者更大&#xff0c;設置左下角為場景頂點&#xff0c;并放置在&#xff08;0&#xff0c;0&#xff09;處。調整攝像機至合適位置。 制作游戲預制體 每個方塊預制體包含有4個小方…

【C++進階】---- 二叉搜索樹

1.二叉搜索樹的概念 ?叉搜索樹?稱?叉排序樹&#xff0c;它或者是?棵空樹&#xff0c;或者是具有以下性質的?叉樹: ? 若它的左?樹不為空&#xff0c;則左?樹上所有結點的值都?于等于根結點的值 ? 若它的右?樹不為空&#xff0c;則右?樹上所有結點的值都?于等于根結…

基于 OpenCV 與 sklearn 的數字識別:KNN 算法實踐

在計算機視覺領域&#xff0c;數字識別是一個經典問題&#xff0c;廣泛應用于郵政編碼識別、車牌識別等場景。本文將介紹如何使用 OpenCV 進行圖像處理&#xff0c;并結合 KNN&#xff08;K 近鄰&#xff09;算法實現數字識別&#xff0c;同時對比 OpenCV 內置 KNN 與 scikit-l…

利用徑向條形圖探索華盛頓的徒步旅行

利用徑向條形圖探索華盛頓的徒步旅行 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import pandas as pdfrom matplotlib.cm import ScalarMappable from matplotlib.lines import Line2D from mpl_toolkits.axes_grid1.inset_locator impor…

火狐瀏覽器中國特供版關閉,如何下載 Firefox 國際版?如何備份數據?

火狐瀏覽器中國特供版關閉&#xff0c;如何下載 Firefox 國際版&#xff1f;如何備份數據&#xff1f;各位火狐老用戶注意了&#xff01;7 月 27 日北京謀智火狐正式發布公告&#xff1a;2025 年 9 月 29 日 24:00 起&#xff0c;中國特供版賬戶服務將徹底關閉&#xff0c;所有…

C語言操作符詳解:從基礎到進階

在C語言中&#xff0c;操作符是構建表達式的基礎&#xff0c;掌握各類操作符的用法、優先級及特性&#xff0c;對寫出高效且正確的代碼至關重要。本文將系統梳理C語言操作符的核心知識點&#xff0c;包含實例代碼與詳細解析&#xff0c;助你徹底搞懂操作符。 1. 操作符的分類 C…

鴻蒙平臺運行Lua腳本

1. 目標 使用 rust 在移動端實現 Lua 腳本的運行。 2. 核心步驟 [Rust Host App]│├── [mLua VM] (通過 mlua 或 rlua 庫嵌入)│ ├── 獨立Lua狀態&#xff08;隔離執行&#xff09;│ ├── 受限標準庫&#xff08;禁用危險函數&#xff09;│ └── 內存/CPU限…

【Ubuntu】發展歷程

Ubuntu 是一個基于 Debian 的 Linux 發行版&#xff0c;由 Canonical 公司開發和維護。它以其易用性、穩定性和強大的社區支持而著稱。以下是 Ubuntu 從發布以來的主要版本和發展歷程&#xff1a;1. Ubuntu 4.10 "Warty Warthog" (2004)發布日期&#xff1a;2004年10…

k8s下springboot-admin 監控服務部署,客戶端接入

踩坑及解決以下問題 1、客戶端監控信息不顯示,需要暴露監控檢查接口路徑 2、服務端不顯示客戶端日志,需要啟用日志,并指定日志路徑 3、解決在k8s下,客戶端多實例注冊id相同,如2個實例只顯示一個 整體架構 springboot-admin 由服務端和客戶端組成 服務端負責 1、提供 We…

git刪除遠程分支和本地分支

1. git刪除遠程分支 git push origin --delete [branch_name]2. 刪除本地分支 2.1 git branch -d 會在刪除前檢查merge狀態&#xff08;其與上游分支或者與head&#xff09;。 git branch -d [branch_name] 2.2 git branch -D 直接刪除 git branch -D 是 git branch --delete…

Go 的時間包:理解單調時間與掛鐘時間

Go 的時間包&#xff1a;理解單調時間與掛鐘時間 &#x1f4c5; 引言 Go 語言自版本 1.9 起在 time.Time 中同時支持 “掛鐘時間&#xff08;wall?clock&#xff09;” 和 “單調時間&#xff08;monotonic clock&#xff09;”&#xff0c;用于分別滿足時間戳與時間間隔測量…

Android啟動時間優化大全

1 修改Android mksh默認的列長度 不修改這個參數&#xff0c;adb shell后&#xff0c;輸入超過80個字符&#xff0c;就不能看到完整的命令行。external/mksh/src/sh.h EXTERN mksh_ari_t x_cols E_INIT(80); EXTERN mksh_ari_t x_lins E_INIT(24);2 Kernel優化 2.1 內核驅動模塊…

matplotlib.pyplot: 底層原理簡析與進階技巧

文章目錄 1 底層實現原理 1.1 核心架構 1.1 渲染流程 2 基礎用法 2.1 基本繪圖 2.2 多子圖系統 2.3 高階用法 2.3.1 自定義Artist對象 2.3.2 高級動畫技術 2.3.3 事件處理系統 2.3.4 混合渲染技術 3 性能優化技巧 4 擴展模塊 5 總結 5.1 底層原理關鍵點 5.2 進階技巧 1 底層實現…

深入理解現代前端開發中的 <script type=“module“> 與構建工具實踐

引言&#xff1a;模塊化開發的演進在早期的前端開發中&#xff0c;JavaScript 缺乏原生的模塊化支持&#xff0c;開發者不得不依賴 IIFE&#xff08;立即調用函數表達式&#xff09;或第三方庫&#xff08;如 RequireJS&#xff09;來實現代碼組織。隨著 ES6&#xff08;ES2015…

yolo--qt可視化開發

qt5可能不支持我們的cuda版本&#xff0c;改用qt6 YOLO11QT6OpencvC訓練加載模型全過程講解_yolov11 模型轉換成opencv c模型-CSDN博客 下面是qt5版本的案例&#xff0c;和yolo及cuda有沖突 安裝qt 切換到虛擬環境&#xff0c;例如pyqt&#xff0c;conda activate pyqt pip …

SQL性能優化

show [session|global] status : 查看服務器狀態 show global status like Com_ : 查看各種語句的執行次數 開啟慢查詢: 在 MySQL 配置文件&#xff08;/etc/my.cnf&#xff09;配置: #開啟MySQL慢日志查詢開關 slow_query_log1 #設置慢日志的時間為2秒&#xff0c;SQL語句執…

ctfshow pwn40

目錄 1. 分析程序 2. 漏洞編寫 3. 漏洞驗證 1. 分析程序 首先檢查程序相關保護&#xff0c;發現程序為32位且只開啟了一個NX保護 checksec pwn 使用IDA進行逆向分析代碼&#xff0c;查看漏洞觸發點&#xff1a; 在main函數中&#xff0c;有一個ctfshow函數&#xff0c;這里…

SQL173 店鋪901國慶期間的7日動銷率和滯銷率

SQL173 店鋪901國慶期間的7日動銷率和滯銷率 SQL題解&#xff1a;店鋪動銷率與滯銷率計算 關鍵&#xff1a;只要當天任一店鋪有任何商品的銷量就輸出該天的結果&#xff0c;即使店鋪901當天的動銷率為0。 潛臺詞&#xff1a;?輸出邏輯與店鋪901的銷售情況無關&#xff0c;只取…

PytorchLightning最佳實踐基礎篇

PyTorch Lightning&#xff08;簡稱 PL&#xff09;是一個建立在 PyTorch 之上的高層框架&#xff0c;核心目標是剝離工程代碼與研究邏輯&#xff0c;讓研究者專注于模型設計和實驗思路&#xff0c;而非訓練循環、分布式配置、日志管理等重復性工程工作。本文從基礎到進階&…

Apache Flink 實時流處理性能優化實踐指南

Apache Flink 實時流處理性能優化實踐指南 隨著大數據和實時計算需求不斷增長&#xff0c;Apache Flink 已經成為主流的流處理引擎。然而&#xff0c;在生產環境中&#xff0c;高并發、大吞吐量和低延遲的業務場景對 Flink 作業的性能提出了更高要求。本文將從原理層面深入解析…