算法刷題記錄——LeetCode篇(1.2) [第11~20題](持續更新)

更新時間:2025-03-29

  • LeetCode題解專欄:實戰算法解題 (專欄)
  • 技術博客總目錄:計算機技術系列目錄頁

優先整理熱門100及面試150,不定期持續更新,歡迎關注!


17. 電話號碼的字母組合

給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。答案可以按 任意順序 返回。
給出數字到字母的映射如下,與電話按鍵相同。注意 1 不對應任何字母。

示例 1:

輸入:digits = "23"
輸出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

輸入:digits = ""
輸出:[]

示例 3:

輸入:digits = "2"
輸出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范圍 ['2', '9'] 的一個數字

方法一:回溯法

通過遞歸生成所有可能的字母組合,每次遞歸選擇一個字母加入當前路徑,處理下一個數字。

代碼實現(Java):

public class Solution {public List<String> letterCombinations(String digits) {List<String> result = new ArrayList<>();if (digits == null || digits.isEmpty()) return result;String[] mapping = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};backtrack(result, new StringBuilder(), digits, 0, mapping);return result;}private void backtrack(List<String> result, StringBuilder current, String digits, int index, String[] mapping) {if (index == digits.length()) {result.add(current.toString());return;}char digit = digits.charAt(index);String letters = mapping[digit - '2']; // 根據數字獲取對應字母集合for (char c : letters.toCharArray()) {current.append(c);                // 添加當前字母backtrack(result, current, digits, index + 1, mapping); // 遞歸處理下一個數字current.deleteCharAt(current.length() - 1); // 回溯,刪除最后添加的字母}}
}

復雜度分析:

  • 時間復雜度: O(3^m*4^n),其中 m 是輸入中對應 3 個字母的數字個數,n 是 4 個字母的數字個數。
  • 空間復雜度: O(k)k 為結果數量,遞歸棧深度最大為輸入長度。

方法二:迭代法(隊列)

通過逐步擴展現有組合生成所有可能結果,利用隊列管理中間過程。

代碼實現(Java):

public class Solution {public List<String> letterCombinations(String digits) {List<String> result = new ArrayList<>();if (digits == null || digits.isEmpty()) return result;String[] mapping = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};Queue<String> queue = new LinkedList<>();queue.offer(""); // 初始空字符串for (int i = 0; i < digits.length(); i++) {char digit = digits.charAt(i);String letters = mapping[digit - '2'];int size = queue.size();for (int j = 0; j < size; j++) {String s = queue.poll();for (char c : letters.toCharArray()) {queue.offer(s + c); // 生成新組合并入隊}}}result.addAll(queue);return result;}
}

復雜度分析:

  • 時間復雜度: O(3^m*4^n),每個數字的處理需要遍歷當前隊列中所有元素。
  • 空間復雜度: O(3^m*4^n),隊列存儲所有中間組合。

方法三:迭代法(逐步構造)

直接通過遍歷每個數字并擴展現有結果,生成所有組合。

代碼實現(Java):

public class Solution {public List<String> letterCombinations(String digits) {List<String> result = new ArrayList<>();if (digits == null || digits.isEmpty()) return result;String[] mapping = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};result.add(""); // 初始空字符串for (char digit : digits.toCharArray()) {List<String> temp = new ArrayList<>();String letters = mapping[digit - '2'];for (String s : result) {for (char c : letters.toCharArray()) {temp.add(s + c); // 將當前字母與現有字符串拼接}}result = temp; // 更新結果}return result;}
}

復雜度分析:

  • 時間復雜度: O(3^m*4^n),每次迭代生成新的組合。
  • 空間復雜度: O(3^m*4^n),存儲所有中間結果。

19. 刪除鏈表的倒數第 N 個結點

給你一個鏈表,刪除鏈表的倒數第 n 個結點,并且返回鏈表的頭結點。

示例 1:

輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]

示例 2:

輸入:head = [1], n = 1
輸出:[]

示例 3:

輸入:head = [1,2], n = 1
輸出:[1]

提示:

  • 鏈表中結點的數目為 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

方法一:雙指針法(一次遍歷)

使用快慢指針技巧,讓快指針先移動n步,然后同時移動快慢指針。當快指針到達鏈表末尾時,慢指針正好指向要刪除節點的前驅節點。通過啞節點簡化邊界條件處理。

  1. 初始化啞節點:避免處理頭節點刪除的特殊情況。
  2. 快指針先移動n步:拉開快慢指針的間距。
  3. 同步移動快慢指針:直到快指針到達鏈表末尾。
  4. 刪除目標節點:修改慢指針的next指針跳過目標節點。

代碼實現(Java):

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode fast = dummy, slow = dummy;// 快指針先移動n步for (int i = 0; i < n; i++) {fast = fast.next;}// 同步移動,直到快指針到達末尾while (fast.next != null) {fast = fast.next;slow = slow.next;}// 刪除目標節點slow.next = slow.next.next;return dummy.next;}
}

復雜度分析:

  • 時間復雜度O(L),其中 L 為鏈表長度,只需一次遍歷。
  • 空間復雜度O(1),僅使用固定額外空間。

方法二:計算鏈表長度(兩次遍歷)

先遍歷鏈表獲取長度 L,再定位到倒數第n個節點的前驅位置(正數第 L-n 個節點),直接刪除目標節點。

  1. 獲取鏈表長度:遍歷鏈表統計節點總數。
  2. 定位前驅節點:通過長度計算前驅位置,移動到該位置。
  3. 刪除目標節點:修改前驅節點的next指針。

代碼實現(Java):

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0);dummy.next = head;int length = getLength(head);ListNode curr = dummy;// 移動到前驅節點位置for (int i = 0; i < length - n; i++) {curr = curr.next;}// 刪除目標節點curr.next = curr.next.next;return dummy.next;}// 輔助函數:計算鏈表長度private int getLength(ListNode head) {int len = 0;while (head != null) {len++;head = head.next;}return len;}
}

復雜度分析:

  • 時間復雜度O(L),兩次遍歷,總體仍為線性時間。
  • 空間復雜度O(1),僅使用固定額外空間。

20. 有效的括號

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

有效字符串需滿足:

  • 左括號必須用相同類型的右括號閉合。
  • 左括號必須以正確的順序閉合。
  • 每個右括號都有一個對應的相同類型的左括號。

示例 1:

輸入:s = "()"
輸出:true

示例 2:

輸入:s = "()[]{}"
輸出:true

示例 3:

輸入:s = "(]"
輸出:false

示例 4:

輸入:s = "([])"
輸出:true

提示:

  • 1 <= s.length <= 10^4
  • s 僅由括號 '()[]{}' 組成

方法:棧輔助法

利用棧結構匹配括號,通過遍歷字符串處理括號閉合關系。

  1. 提前剪枝:字符串長度為奇數時直接返回false,因為有效括號必須成對出現
  2. 棧結構操作
    • 遇到左括號時壓入棧頂。
    • 遇到右括號時彈出棧頂元素,檢查是否匹配。
  3. 三種失效情況處理
    • 右括號出現時棧為空(無對應左括號)。
    • 右括號與棧頂左括號類型不匹配。
    • 遍歷結束后棧中仍有未匹配左括號。

代碼實現(Java):

class Solution {public boolean isValid(String s) {if (s.length() % 2 != 0) return false; // 奇數長度直接無效Deque<Character> stack = new ArrayDeque<>();for (char c : s.toCharArray()) {if (c == '(' || c == '[' || c == '{') { // 左括號入棧stack.push(c);} else { // 右括號匹配if (stack.isEmpty()) return false; // 棧空說明無對應左括號char top = stack.pop();if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {return false;}}}return stack.isEmpty(); // 最后檢查棧是否為空}
}

復雜度分析:

  • 時間復雜度: 單次遍歷字符串O(n),棧操作O(1),總時間復雜度O(n)

聲明

  1. 本文版權歸 CSDN 用戶 Allen Wurlitzer 所有,遵循CC-BY-SA協議發布,轉載請注明出處。
  2. 本文題目來源 力扣-LeetCode ,著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

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

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

相關文章

如何在 vue 渲染百萬行數據,vxe-table 渲染百萬行數據性能對比,超大量百萬級表格渲染

vxe-table 渲染百萬行數據性能對比&#xff0c;超大量百萬級表格渲染&#xff1b;如何在 vue 渲染百萬行數據&#xff1b;當在開發項目時&#xff0c;遇到需要流暢支持百萬級數據的表格時&#xff0c; vxe-table 就可以非常合適了&#xff0c;不僅支持強大的功能&#xff0c;虛…

阿里 FunASR 開源中文語音識別大模型應用示例(準確率比faster-whisper高)

文章目錄 Github官網簡介模型安裝非流式應用示例流式應用示例 Github https://github.com/modelscope/FunASR 官網 https://www.funasr.com/#/ 簡介 FunASR是一個基礎語音識別工具包&#xff0c;提供多種功能&#xff0c;包括語音識別&#xff08;ASR&#xff09;、語音端…

如何使用 LLaMA-Factory 微調 LLaMA3

【LLaMa3微調】使用 LLaMA-Factory 微調LLaMA3 實驗環境 1.1 機器 操作系統&#xff1a;Windows 10 或 UbuntuPyTorch 版本&#xff1a;2.1.0Python 版本&#xff1a;3.10&#xff08;針對Ubuntu 22.04&#xff09;Cuda 版本&#xff1a;12.1GPU 配置&#xff1a;p100 (16GB) …

使用Java ApI 實現Hadoop文件上傳

目錄 文件傳輸步驟 windows的本機文件傳輸 linux的虛擬機文件傳輸 文件傳輸步驟 建立連接 在connect2HDFS()方法中&#xff0c;通過設置Configuration對象來指定HDFS的URI&#xff08;在這個例子中為hdfs://192.168.12.133:9000&#xff09;&#xff0c;并初始化一個FileSys…

喜訊 | 耘瞳科技視覺檢測與測量裝備榮膺“2024機器視覺創新產品TOP10”

3月28日&#xff0c;全球機器視覺行業盛會VisionChina2025&#xff08;上海&#xff09;機器視覺展完美收官。展會期間&#xff0c;由機器視覺產業聯盟&#xff08;CMVU&#xff09;舉辦的“2024機器視覺創新產品TOP10”企業名單正式揭曉&#xff0c;耘瞳科技“工業跨尺度場景實…

數據可視化(matplotlib)-------圖表樣式美化

目錄 一、圖表樣式概述 &#xff08;一&#xff09;、默認圖表樣式 &#xff08;二&#xff09;、圖表樣式修改 1、局部修改 2、全局修改 二、使用顏色 &#xff08;一&#xff09;、使用基礎顏色 1、單詞縮寫或單詞表示的顏色 2、十六進制/HTML模式表示的顏色 3、RGB…

202518 | Ngnix

Ngnix是什么 Nginx&#xff08;發音為“engine-x”&#xff09;是一個開源的高性能HTTP服務器、反向代理服務器、負載均衡器和郵件代理服務器。它由俄羅斯程序員Igor Sysoev開發&#xff0c;首次發布于2004年&#xff0c;旨在解決C10K問題&#xff08;即如何高效地處理10,000個…

WP Mail 郵件發送:WordPress Mail SMTP設置

在我們WordPress搭建個人網站完成后&#xff0c;讀者或者客戶發送的電子郵件&#xff0c;包括你的WPForms電子郵件通知&#xff0c;如果無法到達預定收件人收件箱&#xff0c;這會對我們網站的運營造成很大的影響&#xff0c;問題在于WordPress Mail SMTP的發送方式。 SMTP&am…

小智機器人關鍵函數解析:MqttProtocol::SendAudio()對輸入的音頻數據進行加密處理,通過UDP發送加密后的音頻數據

MqttProtocol::SendAudio()對輸入的音頻數據進行加密處理&#xff0c;通過UDP發送加密后的音頻數據。 源碼&#xff1a; void MqttProtocol::SendAudio(const std::vector<uint8_t>& data) {// 使用互斥鎖保護臨界區&#xff0c;確保同一時間只有一個線程可以訪問該…

Hadoop 常用命令集總覽

Hadoop 常用命令集總覽 在大數據處理領域&#xff0c;Hadoop 作為一種廣泛應用的分布式系統基礎架構&#xff0c;其重要性不言而喻。熟練掌握 Hadoop 的常用命令對于高效的數據處理和分析工作至關重要。本文將對 Hadoop 的常用命令進行專業而詳盡的列舉&#xff0c;并結合實例進…

mac m4 Homebrew安裝MySQL 8.0

1.使用Homebrew安裝MySQL8 在終端中輸入以下命令來安裝MySQL8&#xff1a; brew install mysql8.0 安裝完成后&#xff0c;您可以通過以下命令來驗證MySQL是否已成功安裝&#xff1a; 2.配置mysql環境變量 find / -name mysql 2>/dev/null #找到mysql的安裝位置 cd /op…

GoLand 2024.3 中文 GO語言開發工具

GoLand 2024.3 中文 GO語言開發工具 文章目錄 GoLand 2024.3 中文 GO語言開發工具一、介紹二、效果三、下載 一、介紹 JetBrains GoLand 2024 &#xff0c;是一款GO語言開發工具&#xff0c;全行代碼補全&#xff1a;能使用本地運行的上下文感知深度學習模型&#xff0c;可以自…

Excel去掉單元格里面的換行的方法

方法一&#xff1a;使用“查找和替換”功能 ?選中單元格?&#xff1a;首先選中需要替換換行符的單元格或區域。 ?打開替換窗口?&#xff1a;按下“CtrlH”快捷鍵&#xff0c;打開“查找和替換”對話框。 ?輸入換行符?&#xff1a; 在“查找內容”框中&#xff0c;你可…

React 中的 Props

Props&#xff08;Properties 的縮寫&#xff09;是 React 中用于組件間通信的核心機制。它們允許數據從父組件單向傳遞到子組件。Props 是 React 組件不可變&#xff08;只讀&#xff09;的輸入參數&#xff0c;這種特性使得組件更加可預測且易于維護。 Props 的核心特性 單…

基于簡單神經網絡的線性回歸

一、概述 本代碼實現了一個簡單的神經網絡進行線性回歸任務。通過生成包含噪聲的線性數據集&#xff0c;定義一個簡單的神經網絡類&#xff0c;使用梯度下降算法訓練網絡以擬合數據&#xff0c;并最終通過可視化展示原始數據、真實線性關系以及模型的預測結果。 二、依賴庫 …

?19.思科路由器:OSPF協議引入直連路由的實驗研究

思科路由器:OSPF協議引入直連路由的實驗研究 一、實驗拓撲二、基本配置2.1、sw1的配置2.2、開啟交換機三層功能三、ospf的配置3.1、R1的配置3.2、R2的配置3.3、重啟ospf進程四、引入直連路由五、驗證結果隨著互聯網技術的不斷發展,路由器作為網絡互聯的關鍵設備,其性能與穩定…

USB——刪除注冊表信息

文章目錄 背景工具下載地址工具使用刪除注冊表信息背景 注測表中已記錄這個設備的信息,但現在設備描述符又指定為了 WinUSB 設備,所以當設備再次插入的時候,不會發送 0xEE 命令,造成了枚舉失敗。 兩種處理方式: 修改枚舉時候的 VID/PID刪除 USB 的注冊表信息工具下載地址…

如何快速解決django報錯:cx_Oracle.DatabaseError: ORA-00942: table or view does not exist

我們在使用django連接oracle進行編程時&#xff0c;使用model進行表映射對接oracle數據時&#xff0c;默認表名組成結構為&#xff1a;應用名_類名&#xff08;如&#xff1a;OracleModel_test&#xff09;&#xff0c;故即使我們庫中存在表test&#xff0c;運行查詢時候&#…

從 0 到跑通的 Qt + OpenGL + VS 項目的完整流程

&#x1f9e9; 全流程目標&#xff1a; 在 Visual Studio 中成功打開、編譯并運行一個 Qt OpenGL 項目&#xff08;.vcxproj 格式&#xff09; ? 第 1 步&#xff1a;安裝必要環境 工具說明Visual Studio 2017 / 2019 / 2022必須勾選 “使用 C 的桌面開發” 和 “MSVC 工具…

鴻蒙開發03樣式相關介紹(二)

文章目錄 一、樣式復用1.1 Styles修飾符1.2 Extend修飾符 二、多態樣式 一、樣式復用 在頁面開發過程中&#xff0c;會出出現大量重復的樣式設置代碼&#xff0c;可以使用Styles和Extend修飾符將幫助我們進行樣式復用。 1.1 Styles修飾符 Styles裝飾器可以將多條樣式設置提煉…