【動態規劃】子數組系列(二)

📝前言說明:

  • 本專欄主要記錄本人的動態規劃算法學習以及LeetCode刷題記錄,按專題劃分
  • 每題主要記錄:(1)本人解法 + 本人屎山代碼;(2)優質解法 + 優質代碼;(3)精益求精,更好的解法和獨特的思想(如果有的話)
  • 文章中的理解僅為個人理解。如有錯誤,感謝糾錯

🎬個人簡介:努力學習ing
📋本專欄:C++刷題專欄
📋其他專欄:C語言入門基礎,python入門基礎,C++學習筆記,Linux
🎀CSDN主頁 愚潤澤

你可以點擊下方鏈接,進行不同專題的動態規劃的學習

點擊鏈接開始學習
斐波那契數列模型路徑問題
簡單多狀態(一)簡單多狀態(二)
子數組系列(一)子數組系列(二)
子序列問題(一)子序列問題(二)
回文串問題兩個數組dp問題(一)
兩個數組的dp問題(二)01背包問題
完全背包二維的背包問題
其他

題目

  • 413. 等差數列劃分
    • 個人解
  • 978. 最長湍流子數組
    • 個人解
    • 優質解
  • 139. 單詞拆分
    • 優質解
  • 467. 環繞字符串中唯一的子字符串
    • 個人解
    • 優質解


413. 等差數列劃分

題目鏈接:https://leetcode.cn/problems/arithmetic-slices/description/
在這里插入圖片描述

個人解

思路:

  • 不解釋了,比較簡單
  • 要注意的是:對于一個以i結尾的子數組,如果以起始位置沒變,改成以i + 1結尾,則這時候子數組總數 + 1

用時:12:00
屎山代碼:

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();vector<int> dp(n, 0);for(int i = 2; i < n; i++){if(dp[i - 1] > 0 && nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2])dp[i] = dp[i - 1] + 1; // else if(nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2])dp[i] = 1;}int ans = 0;for(auto x: dp)ans += x;return ans;}
};

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


978. 最長湍流子數組

題目鏈接:https://leetcode.cn/problems/longest-turbulent-subarray/description/
在這里插入圖片描述

個人解

思路:

  • 麻煩點在于,要處理==的情況

用時:25:00
屎山代碼(寫的太丑陋了):

class Solution {
public:int maxTurbulenceSize(vector<int>& nums) {int n = nums.size();vector<int> dp(n, 1);if(n == 1) return 1;if(n == 2 && nums[1]!= nums[0]) return n;if(n == 2 && nums[1] == nums[0]) return 1;// 初始化bool flag1 = nums[1] - nums[0] > 0? true : false;bool flag2 = nums[2] - nums[1] > 0? true : false;if(nums[2] == nums[1])dp[2] = 1;else if(nums[1] == nums[0])dp[2] = 2;else dp[2] = flag1 != flag2? 3: 2;int ans = dp[2];for(int i = 3; i < n ; i++){if(nums[i] == nums[i - 1])continue;dp[i] = 2;if(nums[i - 1] == nums[i - 2])continue;flag1 = nums[i] - nums[i - 1] > 0? true : false;flag2 = nums[i - 1] - nums[i - 2] > 0? true : false;if(flag1 == flag2)continue;if(dp[i - 1] > 2)dp[i] = dp[i - 1] + 1;elsedp[i] = 3;}for(auto x: dp)ans = max(ans, x);return ans;}
};

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


優質解

  • 一個湍流子數組,以i位置為結尾可以分成兩種狀態> / <
  • 利用多狀態的狀態轉移來填dp

代碼(力扣官方題解):

class Solution {
public:int maxTurbulenceSize(vector<int>& arr) {int n = arr.size();vector<vector<int>> dp(n, vector<int>(2, 1));dp[0][0] = dp[0][1] = 1;for (int i = 1; i < n; i++) {if (arr[i - 1] > arr[i]) {dp[i][0] = dp[i - 1][1] + 1;} else if (arr[i - 1] < arr[i]) {dp[i][1] = dp[i - 1][0] + 1;}}int ret = 1;for (int i = 0; i < n; i++) {ret = max(ret, dp[i][0]);ret = max(ret, dp[i][1]);}return ret;}
};

139. 單詞拆分

題目鏈接:https://leetcode.cn/problems/word-break/description/
在這里插入圖片描述


優質解

思路:

  • dp[i]s[0 , i]這部分子串,能否被字典中的單詞拼接而成
    • 我們怎么利用dp[i - 1]呢(前面的信息記錄的是前面的字符串能否被字典中的單詞拼接而成)
    • 也就是說:我們可以把[0, i]分成兩份,[j, i]記錄最后一個單詞(完整的)
    • 如果[j, i]的單詞在字典中,且[0, j - 1]這部分能被字典拼接而成,則i位置就行。巧妙用到的dp[j]
  • 狀態轉移方程:j遍歷[0, i](即得到i結尾的最后一個單詞)
    • 如果,dp[j - 1] == true && s[j, i] in wordDicttrue
    • 否則,false
  • 初始化:j會越界,添加一個哨兵節點。那此時字符串的下標和數組不對應了,所以我們可以在字符串前面也加多一個字符串。且dp[0] = true
  • 填表順序:從左往右
  • 返回值:dp[n]

代碼:

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordDictset; // 轉換成哈希表,后續使用find方便for(auto word:wordDict){wordDictset.insert(word);}s = '0' + s;int n = s.size();vector<bool> dp(n + 1, false);dp[0] = true;for(int i = 1; i <= n; i++){for(int j = i; j >= 1; j--) // 選擇從后往前{if(dp[j - 1] && wordDictset.find(s.substr(j, i - j + 1)) != wordDictset.end()){dp[i] = true;break;}}}return dp[n];}
};

467. 環繞字符串中唯一的子字符串

題目鏈接:https://leetcode.cn/problems/unique-substrings-in-wraparound-string/description/
在這里插入圖片描述

個人解

思路:

  • dp[i]:以 i 結尾的子串是否在 base 中出現
  • 狀態轉移:如果dp[i - 1] > 1 && (s[i] == s[i - 1] + 1 || s[i] == s[i - 1] - 25) // 回繞到 z
    • 則 dp[i] = dp[i - 1] + 1
  • 重復子串怎么處理呢???

優質解

思路:

  • 對于這種子串問題,我們可以以最后一個位置為結尾,把子串的狀態專業給區分出來,如:單獨最后一個位置 / 前 i - 1的子串 + 最后一個位置
  • 返回值是重難點
  • 對于重復的子串,長的子串一定包含短的子串的所有子串
  • 所以,我們可以遍歷dp表,對于相同的字符的dp值,只添加大的

代碼:

class Solution {
public:int findSubstringInWraproundString(string s) {int n = s.size();int dp_max[26] = {0}; // 記錄每個字符出現的子串的最大值vector<int> dp(n, 1); // 單個字符,dp[i] == 1dp_max[s[0] - 'a'] = 1;for(int i = 1; i < n; i++){if(s[i] == s[i - 1] + 1 || s[i] == s[i - 1] - 25)dp[i] += dp[i - 1];dp_max[s[i] - 'a'] = max(dp_max[s[i] - 'a'], dp[i]); // 更新字符對應的子串最大值}int ans = 0;for(auto x: dp_max)ans += x;return ans;}
};

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


🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

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

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

相關文章

68元開發板,開啟智能硬件新篇章——明遠智睿SSD2351深度解析

在智能硬件開發領域&#xff0c;開發板的選擇至關重要。它不僅關系到項目的開發效率&#xff0c;還直接影響到最終產品的性能與穩定性。而今天&#xff0c;我要為大家介紹的這款明遠智睿SSD2351開發板&#xff0c;僅需68元&#xff0c;卻擁有遠超同價位產品的性能與功能&#x…

篇章六 數據結構——鏈表(二)

目錄 1. LinkedList的模擬實現 1.1 雙向鏈表結構圖?編輯 1.2 三個簡單方法的實現 1.3 頭插法 1.4 尾插法 1.5 中間插入 1.6 刪除 key 1.7 刪除所有key 1.8 clear 2.LinkedList的使用 2.1 什么是LinkedList 5.2 LinkedList的使用 1.LinkedList的構造 2. LinkedList的…

刪除隊列中整數

給定一個長度為N的整數數列A_1,A_2,...,A_N&#xff0c;請重復以下操作K次。 每次選擇數列中最小的整數&#xff08;如果最小值不止一個&#xff0c;選擇最靠前的&#xff09;&#xff0c;將其刪除&#xff0c;并把與它相鄰的整數加上被刪除的數值。 請問K次操作后的序列是什…

[神經網絡]使用olivettiface數據集進行訓練并優化,觀察對比loss結果

結合歸一化和正則化來優化網絡模型結構&#xff0c;觀察對比loss結果 搭建的神經網絡&#xff0c;使用olivettiface數據集進行訓練&#xff0c;結合歸一化和正則化來優化網絡模型結構&#xff0c;觀察對比loss結果 from sklearn.datasets import fetch_olivetti_faces #倒入數…

算法分析·回溯法

回溯法 方法概述算法框架問題實例TSP 問題n皇后問題 回溯法效率分析 方法概述 回溯法是一個既帶有系統性又帶有跳躍性的搜索算法&#xff1b; **系統性&#xff1a;**它在包含問題的所有解的解空間樹中&#xff0c;按照深度優先的策略&#xff0c;從根結點出發搜索解空間樹。…

Golang分布式系統開發實踐指南

Golang分布式系統開發實踐指南 一、為什么選擇Golang&#xff1f; ?原生并發模型? Goroutine和Channel機制天然適合分布式系統的并發需求?高性能編譯? 靜態編譯生成二進制文件&#xff0c;部署簡單&#xff0c;內存占用低?豐富生態? Go Module管理、標準庫支持HTTP/2、…

基于stm32風速風向溫濕度和瓦斯檢測(仿真+代碼)

資料下載地址&#xff1a;基于stm32風速風向溫濕度和瓦斯檢測 一、項目功能 1.風速&#xff0c;風向&#xff0c;溫濕度&#xff0c;瓦斯&#xff0c;報警。 2.可以設置溫濕度&#xff0c;瓦斯&#xff0c;風速報警閾值。 3.數據上傳到云平臺。 二、仿真圖 三、程序 #inc…

桃黑黑反斗戰

1.編寫求解Hanoi漢諾塔的遞歸算法代碼&#xff0c;輸出移動過程&#xff0c;并統計總移動次數。 對不同規模的漢諾塔&#xff0c;給出測試的結果 #include <stdio.h> #include <time.h> int moveCount 0; void hanoi(int n,char source,char auxiliary,char targ…

react-native的token認證流程

在 React Native 中實現 Token 認證是移動應用開發中的常見需求&#xff0c;它用于驗證用戶的身份并授權其訪問受保護的 API 資源。 Token 認證的核心流程&#xff1a; 用戶登錄 (Login): 用戶在前端輸入用戶名和密碼。前端將這些憑據發送到后端 API。后端驗證憑據。如果驗證成…

Dify:詳解 docker-compose.yaml配置文件

詳解 docker-compose.yaml 配置文件 docker-compose.yaml 是用于定義和運行多容器 Docker 應用的配置文件。下面&#xff0c;我們將詳細解釋您提供的 docker-compose.yaml 文件&#xff0c;包括各個服務的作用、配置&#xff0c;以及它們與 .env 文件之間的關系。 文件概覽 自…

Python基于Django的主觀題自動閱卷系統【附源碼、文檔說明】

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

今日行情明日機會——20250528

上證指數縮量收小陰線&#xff0c;個股跌多漲少&#xff0c;總體情緒偏差&#xff0c;注意風險為主。 深證指數&#xff0c;縮量收小陰線&#xff0c;連續5天陰線&#xff0c;明后天反彈的概率增大&#xff0c;但仍要注意風險。 2025年5月28日漲停股主要行業方向分析 1. 無人…

基于stm32LORA無線抄表系統仿真

資料下載地址&#xff1a;基于stm32LORA無線抄表系統仿真 1、項目介紹 基于LoRa的無線通信的電力抄表系統&#xff0c;采集節點數據&#xff0c;通過LoRa無線通信進行數據傳輸&#xff0c;最后再網關節點上顯示。 2、仿真圖 3、仿真代碼 #include "oled.h" #incl…

不同電腦同一個網絡ip地址一樣嗎

不同電腦在連接同一個WiFi時&#xff0c;它們的IP地址會相同嗎&#xff1f;相信不少朋友都對這個問題感到好奇&#xff0c;今天我們就來詳細探討一下。 一、基礎概念&#xff1a;IP地址的本質與分類 IP地址是分配給網絡設備的唯一標識符&#xff0c;用于在互聯網或局域網中定位…

CentOS 7 下 Redis 從 5.0 升級至 7.4.3 全流程實踐

目錄 前言1 查看 Redis 運行情況與配置1.1 查看 Redis 是否正在運行1.2 連接 Redis 服務并獲取配置信息1.3 查找 redis.conf 配置文件位置 2 關閉舊版本 Redis 實例2.1 使用客戶端命令關閉 Redis2.2 驗證 Redis 是否完全關閉 3 升級 GCC 編譯環境3.1 檢查當前 GCC 版本3.2 安裝…

SQLord: 基于反向數據生成和任務拆解的 Text-to-SQL 企業落地方案

曾在Text-to-SQL方向做過深入的研究&#xff0c;以此為基礎研發的DataAgent在B2B平臺成功落地&#xff0c;因此作為第一作者&#xff0c;在 The Web Conference (WWW’2025, CCF-A) 會議上發表了相關論文&#xff1a; SQLord: A Robust Enterprise Text-to-SQL Solution via R…

內網搭建NTS服務器

內網搭建NTS服務器 關鍵字 : ntp nts ipv6 NTS 是 Network Time Security&#xff08;網絡時間安全&#xff09;的縮寫,是 NTP 的一種安全擴展機制。它利用傳輸層安全&#xff08;TLS&#xff09;和相關數據的認證加密&#xff08;AEAD&#xff09;&#xff0c;為 NTP 的客戶…

AD9268、AD9643調試過程中遇到的問題

Ad9268芯片 AD9268是一款雙通道、16位、80 MSPS/105 MSPS/125 MSPS模數轉換器(ADC)。AD9268旨在支持要求高性能、低成本、小尺寸和多功能的通信應用。雙通道ADC內核采用多級差分流水線架構&#xff0c;集成輸出糾錯邏輯。每個ADC都具有寬帶寬、差分采樣保持模擬輸入放大器&…

用豆包寫單元測試

用豆包寫單元測試&#xff0c; 輸入 vue 模板內容&#xff0c;輸入 參考vue模板內容寫一個單元測試要求用jest.mock實現構造完成&#xff0c;修復bug。npm run test:unit – tests/unit/views/xxx/xxx.spec.js看下 % Stmts 語句覆蓋率&#xff1a;執行到的代碼語句占總語句的比…

css樣式塊重復調用

通譯靈碼解釋。還給了一些示例&#xff0c;包含傳參等內容 scss和sass的區別。scss與sass是兩種樣式編寫風格&#xff0c;scss是大括號加;號形式。而sass是縮進的格式使用scss為什么要要安裝sass呢。sass是一門css預處理器語言。所以要安裝。