算法訓練(leetcode)二刷第三十七天 | *300. 最長遞增子序列、674. 最長連續遞增序列、*718. 最長重復子數組

刷題記錄

  • *300. 最長遞增子序列
  • 674. 最長連續遞增序列
    • 基礎解法(非動規)
    • 動態規劃
  • 718. 最長重復子數組
    • 滾動數組

*300. 最長遞增子序列

leetcode題目地址

dp數組含義:
dp[i]表示以nums[i]結尾的最長遞增子序列長度,即以nums[i]結尾的子序列的長度。
j從0向i遍歷,遇到num[i] > num[j], dp[i] = max(dp[j]+1, dp[i]);

時間復雜度: O ( n 2 ) O(n^2) O(n2)
空間復雜度: O ( n ) O(n) O(n)

// java
class Solution {public int lengthOfLIS(int[] nums) {int len = nums.length; int[] dp = new int[len];int result = 1;// for(int i=0; i<len; i++) dp[i] = 1;Arrays.fill(dp, 1);for(int i=1; i<len; i++){for(int j=0; j<i; j++){if(nums[i] > nums[j]) dp[i] = Math.max(dp[i], dp[j]+1);}if(result < dp[i]) result = dp[i];}return result;}
}

674. 最長連續遞增序列

leetcode題目地址

基礎解法(非動規)

求最長連續遞增子序列,統計子序列記錄最長即可。在遞增中斷時,計數器要置為1而非0,因為下一個子序列從當前元素開始。

時間復雜度: O ( n ) O(n) O(n)
空間復雜度: O ( n ) O(n) O(n)

// java
class Solution {public int findLengthOfLCIS(int[] nums) {int result = 1;int cnt = 1;int len = nums.length;for(int i=1; i<len; i++){if(nums[i]>nums[i-1]) {cnt++;if(cnt > result) result = cnt;}else cnt = 1; // 計數器置為1}return result;}
}

動態規劃

dp數組含義:
dp[i]表示以nums[i]結尾的最長連續遞增子序列的長度。

初始化:
每個元素本身就是一個連續遞增子序列,因此初始化為1,即dp數組均初始化為1。

// java
class Solution {public int findLengthOfLCIS(int[] nums) {int len = nums.length;int[] dp = new int[len];Arrays.fill(dp, 1);int result = 1;for(int i=1; i<len; i++){if(nums[i] > nums[i-1]) dp[i] = dp[i-1]+1;result = Math.max(result, dp[i]);}return result;}
}

718. 最長重復子數組

leetcode題目地址

dp數組含義:
dp[i][j]表示 以nums1[i-1]結尾的子數組A 和以 以nums2[j-1]結尾的子數組B 的最長重復子數組長度。

這里為什么要用i-1和j-1?
因為dp[i][j]的更新依賴于dp[i-1][j-1]的值。也就是說,在nums1[i-1]和nums2[j-1]相等時,更新對應位置長度需要依賴nums1[i-2]和nums2[j-2]的最長重復子數組長度。
以題目示例1舉例:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]

  • 當nums1[2] == nums2[0]時,當前位置的最長重復子數組長度依賴于前面的匹配情況,前面相等的串長度為0,因此這里dp[3][1]是1。
  • 當nums1[3] == nums2[1]時,邏輯同上,dp[4][2]的更新依賴于前面的匹配情況,前面有一個元素匹配到,因此這里dp[4][2] = dp[3][1]+1 = 2
  • 當nums1[4] == nums2[2]時,邏輯同上,dp[5][3]的更新依賴于前面的匹配情況,前面有兩個元素匹配到,因此這里dp[5][3] = dp[4][2]+1 = 3

到這里就可以總結出狀態轉移方程,dp[i][j] = dp[i-1][j-1] + 1
由于這里使用了i-1和j-1,在i和j為0時會越界。 因此整體將dp數組下標后移一位,來解決這一問題。(也可單獨處理i和j為0的情況,較復雜)

時間復雜度: O ( n 2 ) O(n^2) O(n2)
空間復雜度: O ( n ) O(n) O(n)

// java
class Solution {public int findLength(int[] nums1, int[] nums2) {int len1 = nums1.length;int len2 = nums2.length;int[][] dp = new int[len1+1][len2+1];int result  = 0;if(nums1[0] == nums2[0]) dp[1][1] = 1;for (int i=1; i<=len1; i++){for(int j=1; j<=len2; j++){if(nums1[i-1] == nums2[j-1]){dp[i][j] = dp[i-1][j-1]+1;}result = Math.max(result, dp[i][j]);// System.out.print(dp[i][j] + " ");}// System.out.println();}return result;}
}

滾動數組

注意:
1、思路同上,只是每一層的狀態是從上一層拷貝下來的,因此在遍歷nums2時要從后向前,防止將前面元素在上一層的狀態覆蓋
2、當遇到元素不相同是要將對應位置賦值0.

// java
class Solution {public int findLength(int[] nums1, int[] nums2) {int len1 = nums1.length;int len2 = nums2.length;int[] dp = new int[len2+1];int result  = 0;for (int i=1; i<=len1; i++){for(int j=len2; j>=1; j--){if(nums1[i-1] == nums2[j-1]){dp[j] = dp[j-1]+1;} else dp[j] = 0; // 注意這里不相等的時候要有賦0的操作result = Math.max(result, dp[j]);}}return result;}
}

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

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

相關文章

Elasticsearch 相關面試題

1. Elasticsearch基礎 Elasticsearch是什么&#xff1f; Elasticsearch是一個分布式搜索引擎&#xff0c;基于Lucene實現。 Mapping是什么&#xff1f;ES中有哪些數據類型&#xff1f; Mapping&#xff1a;定義字段的類型和屬性。 數據類型&#xff1a;text、keyword、integer、…

TCP/IP的分層結構、各層的典型協議,以及與ISO七層模型的差別

1. TCP/IP的分層結構 TCP/IP模型是一個四層模型&#xff0c;主要用于網絡通信的設計和實現。它的分層結構如下&#xff1a; (1) 應用層&#xff08;Application Layer&#xff09; 功能&#xff1a;提供應用程序之間的通信服務&#xff0c;處理特定的應用細節。 典型協議&am…

pycharm技巧--鼠標滾輪放大或縮小 Pycharm 字體大小

1、鼠標滾輪調整字體 設置 Ctrl 鼠標滾輪調整字體大小 備注&#xff1a; 第一個是活動窗口&#xff0c;即縮放當前窗口 第二個是所有編輯器窗口&#xff0c;即縮放所有窗口的字體 2、插件 漢化包&#xff1a; Chinese Simplified 包

硬件工程師入門教程

1.歐姆定律 測電壓并聯使用萬用表測電流串聯使用萬用表&#xff0c;紅入黑出 2.電阻的阻值識別 直插電阻 貼片電阻 3.電阻的功率 4.電阻的限流作用 限流電阻阻值的計算 單位換算關系 5.電阻的分流功能 6.電阻的分壓功能 7.電容 電容簡單來說是兩塊不連通的導體加上中間的絕…

edge瀏覽器將書簽欄頂部顯示

追求效果&#xff0c;感覺有點丑&#xff0c;但總歸方便多了 操作路徑&#xff1a;設置-外觀-顯示收藏夾欄-始終

【SPIE出版,見刊快速,EI檢索穩定,浙江水利水電學院主辦】2025年物理學與量子計算國際學術會議(ICPQC 2025)

2025年物理學與量子計算國際學術會議&#xff08;ICPQC 2025&#xff09;將于2025年4月18-20日在中國杭州舉行。本次會議旨在匯聚全球的研究人員、學者和業界專家&#xff0c;共同探討物理學與量子計算領域的最新進展與前沿挑戰。隨著量子技術的快速發展&#xff0c;其在信息處…

谷歌瀏覽器更新后導致的刷新數據無法顯示

這幾天突然出現的問題&#xff0c;就是我做了一個網站&#xff0c;一直用Google展示&#xff0c;前兩天突然就是刷新會丟失數據&#xff0c;然后再刷新幾次吧又有了&#xff0c;之前一直好好的&#xff0c;后端也做了一些配置添加了CrossOrigin注解&#xff0c;然而換了edge瀏覽…

UE5從入門到精通之多人游戲編程常用函數

文章目錄 前言一、權限與身份判斷函數1. 服務器/客戶端判斷2. 網絡角色判斷二、網絡同步與復制函數1. 變量同步2. RPC調用三、連接與會話管理函數1. 玩家連接控制2. 網絡模式判斷四、實用工具函數前言 UE5給我們提供了非常強大的多人網路系統,讓我們可以很方便的開發多人游戲…

軟件需求管理辦法,軟件開發管理指南(Word原件)

1. 目的 2. 適用范圍 3. 參考文件 4. 術語和縮寫 5. 需求獲取的方式 5.1. 與用戶交談向用戶提問題 5.1.1. 訪談重點注意事項 5.1.2. 訪談指南 5.2. 參觀用戶的工作流程 5.3. 向用戶群體發調查問卷 5.4. 已有軟件系統調研 5.5. 資料收集 5.6. 原型系統調研 5.6.1. …

利用python和gpt寫一個conda環境可視化管理工具

最近在學習python&#xff0c;由于不同的版本之間的差距較大&#xff0c;如果是用環境變量來配置python的話&#xff0c;會需要來回改&#xff0c;于是請教得知可以用conda來管理&#xff0c;但是conda在管理的時候老是要輸入命令&#xff0c;感覺也很煩&#xff0c;于是讓gpt幫…

【復習】計算機網絡

網絡模型 OSI 應用層&#xff1a;給應用程序提供統一的接口表示層&#xff1a;把數據轉換成兼容另一個系統能識別的格式會話層&#xff1a;負責建立、管理、終止表示層實體之間的通信會話傳輸層&#xff1a;負責端到端的數據傳輸網絡層&#xff1a;負責數據的路由、轉發、分片…

圖書館系統源碼詳解

本項目是一個基于Scala語言開發的圖書館管理系統。系統主要由以下幾個部分組成&#xff1a;數據訪問層&#xff08;DAO&#xff09;、數據模型層&#xff08;Models&#xff09;、服務層&#xff08;Service&#xff09;以及用戶界面層&#xff08;UI&#xff09;。以下是對項目…

Redis——用戶簽到BitMap,UV統計

目錄 BitMap 使用場景 1. 用戶簽到系統 2. 用戶行為標記 3. 布隆過濾器&#xff08;Bloom Filter&#xff09; BitMap介紹 Redis中的使用 Redis功能示例 添加&#xff1a; 獲取&#xff1a; 批量獲取&#xff1a; java中實現 統計本月連續簽到次數 UV統計 UV 統計…

【數據庫】【MySQL】索引

MySQL中索引的概念 索引&#xff08;MySQL中也叫做"鍵&#xff08;key&#xff09;"&#xff09;是一種數據結構&#xff0c;用于存儲引擎快速定找到記錄。 簡單來說&#xff0c;它類似于書籍的目錄&#xff0c;通過索引可以快速找到對應的數據行&#xff0c;而無需…

【SpringBoot AI 集成DeepSeek 大模型API調用】

當DeepSeek開始盛行&#xff0c;提供強大的大語言模型&#xff0c;界面調用不能滿足我們的需要&#xff0c;同時提供API接口供我們在服務中調用&#xff0c;來實現各種AI場景。 我們通過將DeepSeek的AI能力與SpringBoot AI相結合&#xff0c;實現智能聊天、問答機器人&#xf…

Linux 性能更好的ftp客戶端 lftp 使用詳解

簡介 LFTP 是一個命令行 FTP 客戶端&#xff0c;支持多種文件傳輸協議&#xff0c;包括 FTP、FTPS、HTTP、HTTPS和SFTP 。它以其通過鏡像、后臺操作和腳本支持等特性有效管理復雜傳輸的能力而聞名。 安裝 Ubuntu/Debian sudo apt update sudo apt install lftpCentOS/RHEL/…

汽車智能制造企業數字化轉型SAP解決方案總結

一、項目實施概述 項目階段劃分&#xff1a; 藍圖設計階段主數據管理方案各模塊藍圖設計方案下一階段工作計劃 關鍵里程碑&#xff1a; 2022年6月6日&#xff1a;項目啟動會2022年12月1日&#xff1a;系統上線 二、總體目標 通過SAP實施&#xff0c;構建研產供銷協同、業財一…

【深度學習】矩陣的理解與應用

一、矩陣基礎知識 1. 什么是矩陣&#xff1f; 矩陣是一個數學概念&#xff0c;通常表示為一個二維數組&#xff0c;它由行和列組成&#xff0c;用于存儲數值數據。矩陣是線性代數的基本工具之一&#xff0c;廣泛應用于數學、物理學、工程學、計算機科學、機器學習和數據分析等…

<網絡> UDP協議

目錄 傳輸層 再談端口號 端口號范圍劃分 認識知名端口號 兩個問題 netstat與iostat pidof UDP協議 UDP協議格式 UDP數據封裝&#xff1a; UDP數據分用&#xff1a; UDP協議的特點 面向數據報 UDP的緩沖區 UDP使用注意事項 基于UDP的應用層協 傳輸層 在學習HTTP等應用層協議時&…

大模型面試基礎問題

1.1.1 最主流的開源模型&#xff1f; ChatGLM-6B[1] prefix LM LLaMA-7B[2] causal LM 1.1.2 prefix LM和causal LM的區別&#xff1f; 1.1.2.1 Prefix LM Prefix LM&#xff0c;即前綴語言模型&#xff0c;該結構是Google的T5模型論文起的名字&#xff0c;望文知義來說&…