HOT100--Day20--39. 組合總和,22. 括號生成,79. 單詞搜索

HOT100–Day20–39. 組合總和,22. 括號生成,79. 單詞搜索

每日刷題系列。今天的題目是《力扣HOT100》題單。

題目類型:回溯。

關鍵:掌握排列,組合。記得回溯。可以重復選的話,下一層index從哪里開始?單詞搜索和括號生成都值得二刷。

39. 組合總和

思路:

注意每個元素可以選任意多次。

所以backtrack的時候,每次前往下一層,都是從當前層的遍歷的到的位置開始進入下一層。

pathSum == target就找到一種情況了。

pathSum > target提前返回。

class Solution {private List<List<Integer>> res = new ArrayList<>();private List<Integer> path = new ArrayList<>();private int pathSum = 0;public List<List<Integer>> combinationSum(int[] candidates, int target) {backtrack(candidates, target, 0);return res;}private void backtrack(int[] nums, int target, int startIndex) {// sum多了,結束if (pathSum > target) {return;}// 找到一種組合的情況if (pathSum == target) {res.add(new ArrayList(path));return;}// 從index開始,加入path。for (int i = startIndex; i < nums.length; i++) {path.add(nums[i]);pathSum += nums[i];// 注意!因為可以重復選,下一層是從i開始選!backtrack(nums, target, i);pathSum -= nums[i];path.remove(path.size() - 1);}}
}

22. 括號生成

思路:

一個原則:左括號要優先于右括號出現。

所以優先填n個左括號,再一個個回溯,嘗試填右括號。

class Solution {private List<String> res = new ArrayList<>();private char[] path;private int n;public List<String> generateParenthesis(int n) {path = new char[n * 2];this.n = n;dfs(0, 0);return res;}// 目前填了 left 個左括號,right 個右括號private void dfs(int left, int right) {// 填完 2n 個括號if (right == n) {res.add(new String(path));return;}// 先填左括號if (left < n) {// 直接覆蓋,所以不用回溯path[left + right] = '(';dfs(left + 1, right);}// 可以填右括號if (right < left) {path[left + right] = ')';dfs(left, right + 1);}}
}

79. 單詞搜索

思路:

  • 找到一個第一個字母匹配的格子,從這里開始dfs進去搜。
  • 定義 dfs(i,j,k) 表示當前在 board[i][j] 這個格子,要匹配 word[k],返回在這個狀態下最終能否匹配成功(搜索成功)。
    1. 不匹配,返回false
    2. 如果匹配完了,返回true
    3. 匹配到中間,k位置已經匹配好了,先標記board=0表示已訪問。
      • 搜索格子周邊的四個格子,如果沒出界的話,dfs進去,探索board[x][y]和word[k+1]是不是相等。
        • 如果下面格子返回true,表示最終找到了(因為是深搜,已經搜到結尾了),直接向上返回true
    4. 如果周邊四個格子都返回false,要恢復現場.把board標記還原回去,再return false
class Solution {private static final int[][] DIRS = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };private char[] word;private char[][] board;public boolean exist(char[][] board, String word) {this.board = board;this.word = word.toCharArray();// 遍歷board每一個格子for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[0].length; j++) {if (board[i][j] == this.word[0] && dfs(i, j, 0)) {return true;}}}return false;}// 表示當前在 board[i][j] 這個格子,要匹配 word[k]private boolean dfs(int i, int j, int k) {if (board[i][j] != word[k]) {return false;}// 匹配完了,返回trueif (k == word.length - 1) {return true;}// 標記,避免重復訪問board[i][j] = 0;// 遍歷周圍的四個格子for (int[] d : DIRS) {int x = i + d[0];int y = j + d[1];if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) {continue;}// 如果下面格子返回true,表示最終找到了(因為是深搜,已經搜到結尾了),直接向上返回trueif (dfs(x, y, k + 1)) {return true;}}// 走到這里,從這里出發不能找到,return false之前,要恢復現場.把board標記還原回去board[i][j] = word[k];return false;}
}

靈茶山艾府:

還可以優化的點:

  1. 統計board和word的字母出現次數,但凡word有一個字母的出現次數比board多,都不可能完成匹配,直接返回false,不用dfs了
  2. 檢查word的首端字母和尾端字母,誰在board的出現頻次高。如果首端的出現次數明顯多于尾端,那么reverse這個word,這樣能減少遞歸次數。

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

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

相關文章

高并發場景下的“命令執行”注入繞道記

環境&#xff1a;CentOS 8 OpenResty 1.21 PHP-FPM 8.0 背景&#xff1a;營銷團隊上線了一個“圖片裁剪”接口&#xff0c;參數直接拼進 shell_exec&#xff0c;結果被打成“礦機”。1. 發現&#xff1a;流量突增 30 倍&#xff0c;卻不見數據庫慢查詢 iftop -i eth0出站 1.8…

【modbus學習】

Modbus通信&#xff08;源于施耐德&#xff09;串行鏈路&#xff1a;RTU&#xff08;傳輸大量數據&#xff0c;適合工業&#xff09;、ASCII&#xff08;少量數據&#xff0c;適合計算機&#xff09;TCP/IP&#xff1a;TCP&#xff08;傳輸嚴謹&#xff0c;效率低&#xff09;、…

Redis單線程模型為什么快?

Redis的單線程模型指的是redis只使用一個線程來出來所有的命令式指令&#xff0c;但是不是意味著redis內部就只使用一個線程來處理所有的任務。都知道redis是一個客戶端-服務器的程序&#xff0c;那么redis就只有一個服務器&#xff0c;但是有多個客戶端&#xff0c;就像mysql一…

前端安全攻防:XSS, CSRF 等常見威脅的防范與檢測指南

在如今高度互聯的 Web 應用世界里&#xff0c;前端安全不再是可有可無的選項&#xff0c;而是構建可信賴、健壯應用的基石。隨著 Web 技術的發展&#xff0c;攻擊者們也變得越來越狡猾&#xff0c;前端遭受的攻擊手段層出不窮。其中&#xff0c;跨站腳本攻擊 (XSS) 和跨站請求偽…

Scikit-learn Python機器學習 - 特征降維 壓縮數據 - 特征選擇 - 移除低方差特征(VarianceThreshold)

鋒哥原創的Scikit-learn Python機器學習視頻教程&#xff1a; 2026版 Scikit-learn Python機器學習 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程主要講解基于Scikit-learn的Python機器學習知識&#xff0c;包括機器學習概述&#xff0c;特征工程(數據…

C#(鏈表創建與原地反轉)

鏈表創建&#xff08;C#&#xff09; 在C#中&#xff0c;鏈表可以通過自定義節點類實現。每個節點包含數據域和指向下一個節點的引用。 public class ListNode {public int val;public ListNode next;public ListNode(int val0, ListNode nextnull) {this.val val;this.next…

Android --- AOSP源碼導入Android Studio

AOSP代碼量龐大&#xff0c;為了開發的方便&#xff0c;我們需要導入到android studio中&#xff0c;其中關鍵的一 項就是配置跳轉。尤其是對于Framework開發來說生成 ipr,iml 工程文件make idegen ./development/tools/idegen/idegen.sh會生成如下文件首先需要修改ipr和iml文件…

游戲中的設計模式——第一篇 設計模式簡介

前言 對于設計模式&#xff0c;相信很多開發者并不陌生&#xff0c;我在學習過程中希望把自己的一些總結和心得體會與你分享。 本專欄主要將重點放在設計模式在游戲中的應用&#xff0c;會結合大家熟悉的游戲場景和功能闡述設計模式在該處應用的好處。因為設計模式很多&#xf…

SpringBoot + RustFS 實現文件切片極速上傳技術

本文將手把手教你如何通過 SpringBoot 和 RustFS 構建高性能文件切片上傳系統&#xff0c;解決大文件傳輸的痛點&#xff0c;實現秒傳、斷點續傳和分片上傳等高級功能。 目錄 一、為什么選擇 RustFS SpringBoot&#xff1f; 二、環境準備與部署 2.1 安裝 RustFS 2.2 Sprin…

在Word和WPS文字中便捷切換英文段落大小寫

在Word和WPS文字中編輯英文段落時&#xff0c;有時候英文字母的大小寫不規范&#xff0c;或者需要把某一段全部改為大寫字母怎么辦&#xff1f;使用ShiftF3組合鍵即可快速在三種模式中切換&#xff1a;全部大寫、全部小寫、首字母大寫——其中首字母大寫的Word是每一句話的第一…

成都金牛區哪里租好辦公室?國際數字影像產業園享稅收優惠

在成都金牛區租賃優質辦公室&#xff0c;國際數字影像產業園憑借其享有的稅收優惠政策&#xff0c;成為了許多企業的首選之地。稅收優惠對于租賃辦公室的企業來說&#xff0c;是一筆不小的成本節省。國際數字影像產業園針對入駐企業提供的稅收優惠政策&#xff0c;能在企業運營…

CSS `:is()` `:where()` 實戰指南:簡化選擇器,提升可維護性

&#x1f3af; CSS :is() & :where() 實戰指南&#xff1a;簡化選擇器&#xff0c;提升可維護性你是否在項目中寫過一大串重復的選擇器&#xff1f;比如&#xff1a; h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem; }這樣的代碼既冗長又難維護。 現在 CSS 提供了 :is() 和…

Linux I/O 訪問架構深入分析

Linux I/O 訪問架構深入分析 目錄 概述I/O 架構層次核心數據結構I/O 處理流程VFS 虛擬文件系統塊設備I/O字符設備I/O內存映射I/O異步I/O機制I/O調度器調試工具與方法性能優化策略 概述 Linux I/O 系統是一個多層次、高度抽象的架構&#xff0c;旨在為應用程序提供統一的文件訪問…

Linux:6_基礎IO

基礎IO 一.理解"文件" 文件分類 1.內存級(被打開)文件 2.磁盤級文件 1. 狹義理解 文件在磁盤里磁盤是永久性存儲介質&#xff0c;因此文件在磁盤上的存儲是永久性的磁盤是外設 (即是輸出設備也是輸入設備)磁盤上的文件本質是對文件的所有操作&#xff0c;都是對外…

Coze源碼分析-資源庫-刪除插件-前端源碼-核心邏輯

刪除插件邏輯 1. 刪除操作入口組件 刪除插件操作主要通過 usePluginConfig hook 中的 renderActions 方法實現&#xff0c;該方法返回 TableAction 組件來處理表格行的操作。 文件位置&#xff1a;frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地狀態(Flink 1.x)

最初的架構將狀態以 JVM Heap 對象的形式存儲在 TaskManager 的內存中。對于小規模數據集&#xff0c;這種方式效果良好&#xff0c;但隨著狀態大小的增長超出內存&#xff0c;將所有狀態保存在內存中變得成本高昂且不穩定。 為了解決狀態規模增長的問題&#xff0c;引入了一種…

跨境金融數據對接實踐:印度NSE/BSE股票行情API集成指南

跨境金融數據對接實踐&#xff1a;印度NSE/BSE股票行情API集成指南 關鍵詞&#xff1a;印度股票數據對接 NSE實時行情 BSE證券接口 金融API開發 Python請求示例一、印度股市數據源技術解析&#xff08;核心價值&#xff09; 印度兩大交易所數據獲取難點&#xff1a; 時區差異&a…

AFSim2.9.0學習筆記 —— 1、AFSim及完整工具介紹(文末附:完整afsim2.9.0源碼、編譯好的完整工具包、中文教材等)

&#x1f514; AFSim2.9.0 相關技術、疑難雜癥文章合集&#xff08;掌握后可自封大俠 ?_?&#xff09;&#xff08;記得收藏&#xff0c;持續更新中…&#xff09; AFSim介紹 AFSim&#xff08;Advanced Framework for Simulation Integration & Modeling【高級仿真集成與…

ArcGIS學習-18 實戰-降雨量空間分布插值分析

設置環境加載要素投影查看要素&#xff0c;發現均不是投影數據&#xff0c;但都是地理坐標都是WGS1984使用工具進行批量投影然后新建空地圖&#xff0c;重新加載確認圖層的投影與柵格數據一致插值樣條法得到反距離權重法插值得到克里金法插值得到

HarmonyOS應用開發:深入理解聲明式UI與彈窗交互的最佳實踐

HarmonyOS應用開發&#xff1a;深入理解聲明式UI與彈窗交互的最佳實踐 引言 隨著HarmonyOS 4.0的發布及后續版本的演進&#xff0c;華為的分布式操作系統已經進入了全新的發展階段。基于API 12及以上的開發環境為開發者提供了更強大、更高效的開發工具和框架。在HarmonyOS應用…