LeetCode演算法訓練 93.複原IP地址 78.子集 90.子集II

来源:https://www.cnblogs.com/cupxu/archive/2023/02/27/17162057.html
-Advertisement-
Play Games

歡迎關註個人公眾號:愛喝可可牛奶 LeetCode演算法訓練 93.複原IP地址 78.子集 90.子集II LeetCode 93. 複原 IP 地址 分析 字元串全部由數字組成,ipv4每一段數字不能有前導0,且大小∈[0,255] 等價於將字元串進行分割,並判斷分割後的數是否滿足條件 插入一個點 ...


歡迎關註個人公眾號:愛喝可可牛奶

LeetCode演算法訓練 93.複原IP地址 78.子集 90.子集II

LeetCode 93. 複原 IP 地址

分析

字元串全部由數字組成,ipv4每一段數字不能有前導0,且大小∈[0,255]

等價於將字元串進行分割,並判斷分割後的數是否滿足條件

插入一個點進行切割、判斷是否滿足條件、再插入、再判斷,直到插入3個點,判斷剩下的一段是否滿足條件

代碼

class Solution {
    List<String> res = new ArrayList<>();

    public List<String> restoreIpAddresses(String s) {
        if (s.length() > 12) return res; // 算是剪枝了
        backTrack(s, 0, 0);
        return res;
    }

    // startIndex: 搜索的起始位置, pointNum:添加逗點的數量
    private void backTrack(String s, int startIndex, int pointNum) {
        if (pointNum == 3) {// 逗點數量為3時,分隔結束
            // 判斷第四段⼦字元串是否合法,如果合法就放進res中
            if (isValid(s,startIndex,s.length()-1)) {
                res.add(s);
            }
            return;
        }
        for (int i = startIndex; i < s.length(); i++) {
            if (isValid(s, startIndex, i)) {
                s = s.substring(0, i + 1) + "." + s.substring(i + 1);    //在str的後⾯插⼊⼀個逗點
                pointNum++;
                backTrack(s, i + 2, pointNum);// 插⼊逗點之後下⼀個⼦串的起始位置為i+2
                pointNum--;// 回溯
                s = s.substring(0, i + 1) + s.substring(i + 2);// 回溯刪掉逗點
            } else {
                break;
            }
        }
    }

    // 判斷字元串s在左閉⼜閉區間[start, end]所組成的數字是否合法
    private Boolean isValid(String s, int start, int end) {
        if (start > end) {
            return false;
        }
        if (s.charAt(start) == '0' && start != end) { // 0開頭的數字不合法
            return false;
        }
        int num = 0;
        for (int i = start; i <= end; i++) {
            if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到⾮數字字元不合法
                return false;
            }
            num = num * 10 + (s.charAt(i) - '0');
            if (num > 255) { // 如果⼤於255了不合法
                return false;
            }
        }
        return true;
    }
}

LeetCode 78. 子集

分析

返回不含相同元素整數數組的子集

收集樹的每個節點

代碼

class Solution {
    List<List<Integer>> result = new ArrayList<>();// 存放符合條件結果的集合
    LinkedList<Integer> path = new LinkedList<>();// 用來存放符合條件結果
    public List<List<Integer>> subsets(int[] nums) {
        subsetsHelper(nums, 0);
        return result;
    }

    private void subsetsHelper(int[] nums, int startIndex){
        //「遍歷這個樹的時候,把所有節點都記錄下來,就是要求的子集集合」。
        result.add(new ArrayList<>(path));
        if (startIndex >= nums.length){ //終止條件可不加
            return;
        }
        for (int i = startIndex; i < nums.length; i++){
            path.add(nums[i]);
            subsetsHelper(nums, i + 1);
            path.removeLast();
        }
    }
}

LeetCode 90. 子集 II

分析

返回含相同元素整數數組的子集 在前面基礎上去重

代碼

class Solution {
    List<List<Integer>> result = new ArrayList<>();// 存放符合條件結果的集合
    LinkedList<Integer> path = new LinkedList<>();// 用來存放符合條件結果
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        subsetsHelper(nums, 0);
        return result;
    }

    private void subsetsHelper(int[] nums, int startIndex){
        //「遍歷這個樹的時候,把所有節點都記錄下來,就是要求的子集集合」。
        result.add(new ArrayList<>(path));
        if (startIndex >= nums.length){ //終止條件可不加
            return;
        }
        for (int i = startIndex; i < nums.length; i++){
            // 註意這裡不是0
            //if(i > 0 && nums[i] == nums[i-1]){
            if(i > startIndex && nums[i] == nums[i-1]){
                continue;
            }
            path.add(nums[i]);
            subsetsHelper(nums, i + 1);
            path.removeLast();
        }
    }
}

總結

  1. 涉及範圍確定,明確開閉區間
  2. 去重方式 Set去重、used數組去重、索引去重

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 異常 1.1. 代碼應該僅在發生意料之外的事情時拋出異常 1.1.1. 防禦性編程性能好 1.2. 異常的處理成本未必很高 1.2.1. 應該只在適當的時候使用 1.2.2. 棧越深,處理異常的成本就越高 1.3. 對於頻繁創建的系統異常,JVM會優化獲取棧軌跡的性能開銷 1.4. 在異常中禁 ...
  • 動態SQL語句 1.基本介紹 官方文檔 mybatis – MyBatis 3 | 動態 SQL 為什麼需要動態SQL? 動態SQL是MyBatis的強大特性之一 使用 JDBC 或其他類似的框架,根據不同條件拼接SQL語句非常麻煩,例如拼接時要確保不能忘記添加必要的空格,還要註意去掉列表最後一個列 ...
  • 原味地址 https://haiyux.cc/2023/02/26/k8s-client-go/ client-go是什麼? client-go是Kubernetes官方提供的Go語言客戶端庫,用於與Kubernetes API伺服器交互。使用client-go,您可以編寫Go語言程式來創建、修改和 ...
  • 通常情況下,部署Django應用到生產環境時都會通過uwsgi部署,uwsgi一些配置項配置問題有可能會導致服務出現502狀態碼或者其他超時等的情況 常用到的配置項如下: reload-on-as = 600 reload-on-rss = 500 evil-reload-on-rss = 800 ...
  • 我們服務啟動時,sybase資料庫 連接直接創建10個連接。(為什麼啟動時會創建這麼多連接?) 有時候可以寫入sybase庫,大部分寫入失敗 查詢sybase庫數據可以查出來 ,沒問題 嘗試的方案1 如圖: Springboot 連接迪砂資料庫 的application.yml 配置文件 我們配置的 ...
  • 首碼和 首碼和,顧名思義,就是所有首碼之和,給一個最基本的例子: 如圖,a為原始數組,s為完成預處理後的數組,很容易看出來s[ i ]=s[ i - 1 ]+a[ i ],而也就是s[ i ]=a[1]+a[2]+……+a[ i ],需要註意的是記s[0]=0。 那麼,如果我想要知道一個區間的區間和 ...
  • JVM總結 1. 記憶體結構 線程私有區 程式計算器 作用:是一塊較小的記憶體空間,存儲的是當前線程所執行的位元組碼文件的序號 特點:線程私有,不會出現記憶體空間溢出 虛擬機棧 虛擬機棧是管理JAVA方法執行的記憶體模型,每個方法執行時都會創建一個當前棧楨,在當前棧楨裡面存儲方法的局部變數表,操作數棧,動態鏈 ...
  • 有關Apifox軟體之前寫過一篇文章: 介面測試神器Apifox,親測好用! 如何一鍵自動生成資料庫文檔之前也寫過一篇文章: 資料庫界的Swagger:一鍵生成資料庫文檔! 一、Apifox插件的優勢 作為一名後端開發在項目開發過程中,肯定需要提供介面文檔。 一般我們有兩種方案 項目結合Swagge ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...