【算法挨揍日記】day30——300. 最長遞增子序列、376. 擺動序列

?300. 最長遞增子序列

300.?最長遞增子序列

題目解析:

給你一個整數數組?nums?,找到其中最長嚴格遞增子序列的長度。

子序列?是由數組派生而來的序列,刪除(或不刪除)數組中的元素而不改變其余元素的順序。例如,[3,6,2,7]?是數組?[0,3,1,6,2,2,7]?的子序列。

解題思路:、

1. 狀態表?:
對于線性 dp ,我們可以?「經驗 + 題?要求」來定義狀態表?:
i. 以某個位置為結尾,巴拉巴拉;
ii. 以某個位置為起點,巴拉巴拉。
這?我們選擇?較常?的?式,以某個位置為結尾,結合題?要求,定義?個狀態表?:
dp[i] 表?:以 i 位置元素為結尾的「所有?序列」中,最?遞增?序列的?度。
2. 狀態轉移?程:
對于 dp[i] ,我們可以根據「?序列的構成?式」,進?分類討論:
i. ?序列?度為 1 :只能??玩了,此時 dp[i] = 1
ii. ?序列?度?于 1 nums[i] 可以跟在前?任何?個數后?形成?序列。
設前?的某?個數的下標為 j ,其中 0 <= j <= i - 1
只要 nums[j] < nums[i] i 位置元素跟在 j 元素后?就可以形成遞增序列,?度
dp[j] + 1
因此,我們僅需找到滿?要求的最?的 dp[j] + 1 即可。
綜上, dp[i] = max(dp[j] + 1, dp[i]) ,其中 0 <= j <= i - 1 && nums[j]
< nums[i]
3. 初始化:
所有的元素「單獨」都能構成?個遞增?序列,因此可以將 dp 表內所有元素初始化為 1
由于?到前?的狀態,因此我們循環的時候從第?個位置開始即可。
4. 填表順序:
顯?易?,填表順序「從左往右」。
5. 返回值:
由于不知道最?遞增?序列以誰結尾,因此返回 dp 表??的「最?值」。

?解題代碼:

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n=nums.size();vector<int>dp(n,1);for(int i=1;i<n;i++){for(int j =0;j<i;j++){if(nums[j]<nums[i])dp[i]=max(dp[i],dp[j]+1);}}int ret=0;for(int i=0;i<n;i++)ret=max(ret,dp[i]);return ret;}
};

?376. 擺動序列

376.?擺動序列

題目描述:

如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為?擺動序列 。第一個差(如果存在的話)可能是正數或負數。僅有一個元素或者含兩個不等元素的序列也視作擺動序列。

  • 例如,?[1, 7, 4, 9, 2, 5]?是一個?擺動序列?,因為差值?(6, -3, 5, -7, 3)?是正負交替出現的。

  • 相反,[1, 4, 7, 2, 5]?和?[1, 7, 4, 5, 5]?不是擺動序列,第一個序列是因為它的前兩個差值都是正數,第二個序列是因為它的最后一個差值為零。

子序列?可以通過從原始序列中刪除一些(也可以不刪除)元素來獲得,剩下的元素保持其原始順序。

給你一個整數數組?nums?,返回?nums?中作為?擺動序列?的?最長子序列的長度?。

?解題思路:

1. 狀態表?:
對于線性 dp ,我們可以?「經驗 + 題?要求」來定義狀態表?:
i. 以某個位置為結尾,巴拉巴拉;
ii. 以某個位置為起點,巴拉巴拉。
這?我們選擇?較常?的?式,以某個位置為結尾,結合題?要求,定義?個狀態表?:
dp[i] 表?「以 i 位置為結尾的最?擺動序列的?度」。
但是,問題來了,如果狀態表?這樣定義的話,以 i 位置為結尾的最?擺動序列的?度我們沒法
從之前的狀態推導出來。因為我們不知道前?個最?擺動序列的結尾處是遞增的,還是遞減的。因
此,我們需要狀態表?能表?多?點的信息:要能讓我們知道這?個最?擺動序列的結尾是遞增的
還是遞減的。
解決的?式很簡單:搞兩個 dp 表就好了。
f[i] 表?:以 i 位置元素為結尾的所有的?序列中,最后?個位置呈現「上升趨勢」的最?擺
動序列的?度;
g[i] 表?:以 i 位置元素為結尾的所有的?序列中,最后?個位置呈現「下降趨勢」的最?擺
動序列的?度。
2. 狀態轉移?程:
由于?序列的構成?較特殊, i 位置為結尾的?序列,前?個位置可以是 [0, i - 1] 的任意
位置,因此設 j [0, i - 1] 區間內的某?個位置。
對于 f[i] ,我們可以根據「?序列的構成?式」,進?分類討論:
i. ?序列?度為 1 :只能??玩了,此時 f[i] = 1
ii. ?序列?度?于 1 :因為結尾要呈現上升趨勢,因此需要 nums[j] < nums[i] 。在滿
?這個條件下, j 結尾需要呈現下降狀態,最?的擺動序列就是 g[j] + 1
因此我們要找出所有滿?條件下的最?的 g[j] + 1
綜上, f[i] = max(g[j] + 1, f[i]) ,注意使? g[j] 時需要判斷。
對于 g[i] ,我們可以根據「?序列的構成?式」,進?分類討論:
i. ?序列?度為 1 :只能??玩了,此時 g[i] = 1
ii. ?序列?度?于 1 :因為結尾要呈現下降趨勢,因此需要 nums[j] > nums[i] 。在滿
?這個條件下, j 結尾需要呈現上升狀態,因此最?的擺動序列就是 f[j] + 1
因此我們要找出所有滿?條件下的最?的 f[j] + 1
綜上, g[i] = max(f[j] + 1, g[i]) ,注意使? f[j] 時需要判斷。
3. 初始化:
所有的元素「單獨」都能構成?個擺動序列,因此可以將 dp 表內所有元素初始化為 1
4. 填表順序:
毫?疑問是「從左往右」。
5. 返回值:
應該返回「兩個 dp 表??的最?值」,我們可以在填表的時候,順便更新?個「最?值」。

解題代碼:

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n=nums.size();if(n==1)return 1;if(n==2&&nums[0]!=nums[1])return 2;vector<int>f(n,1);vector<int>g(n,1);for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(nums[i]>nums[j])f[i]=max(g[j]+1,f[i]);if(nums[i]<nums[j])g[i]=max(f[j]+1,g[i]);}}int ret=0;for(int i=0;i<n;i++)ret=max(ret,max(f[i],g[i]));return ret;}
};

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

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

相關文章

遞增遞減運算符 ++ -- 前置后置的區別

1 18 運算符-算術運算符-遞增遞減_嗶哩嗶哩_bilibili 2 .1 #include <iostream> using namespace std; int main() {int a 0;int b 0;a ;b ;cout << "a " << a << endl;cout << "b " << b << endl;} 輸出…

whip和whep

原文為runner365.git大佬的文章 原文鏈接&#xff1a;https://blog.csdn.net/sweibd/article/details/124552793 WHIP接口 什么是whip 全稱: WebRTC-HTTP ingestion protocol (WHIP). rfc地址: rfc-draft-murillo-whip-00 簡單說&#xff0c;就是通過HTTP接口能導入webrtc媒…

上位機與plc寫心跳定時掃描連接狀態

方法一&#xff1a;上位機讀plc的某個地址&#xff0c;每秒 置0和置1&#xff0c;plc檢查地址值每3秒值都是1就報錯。 方法二&#xff1a;上位機每兩秒給地址置1&#xff0c;plc一秒讀到1就清除信號&#xff0c;讀到0說明心跳掉線了。

C++電腦組裝項目(涉及知識點:多態)

需求&#xff1a; #include <iostream> #include "Computer.h" #include "AbstractCpu.h" #include "AbstractMemory.h" #include "AbstractVideoCard.h" #include "IntelCpu.h" #include "IntelMemory.h" …

Redis的持久化(新)

Redis中數據都保存在內存&#xff0c;但是內存中的數據變換很快&#xff0c;也很容易丟失&#xff0c;比如連接斷開、宕機停機等等。而Redis提供的數據持久化機制有RDB(Redis DataBase)和AOF(Append Only File)。 1.RDB RDB是指在指定的時間間隔內將內存中的數據集快照寫入到磁…

HTML玩轉超鏈接a標簽

大家應該都知道&#xff0c;a標簽主要是轉跳鏈接&#xff0c;接下來&#xff0c;讓我為大家介紹一下a標簽的使用&#xff01; 主要的作用&#xff1a;從當前頁面進行跳轉 標簽名標簽語義常用屬性單/雙標簽a超鏈接href&#xff1a;要跳轉的具體位置 target&#xff1a;跳轉時如…

第一百七十七回 如何創建垂直方向的Switch

文章目錄 1. 概念介紹2. 思路與方法2.1 實現思路2.2 實現方法3. 示例代碼4. 內容總結我們在上一章回中介紹了"如何創建漸變色邊角"相關的內容,本章回中將介紹" 如何創建垂直方向的Switch".閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在前面…

zookeeper單機版的搭建

一 zookeeper的搭建 1.1 上傳zkjar包 1.2 搭建配置 1.解壓壓縮包 [rootlocalhost export]# tar -zxvf zookeeper-3.7.0-bin.tar.gz 2.創建data文件夾 [rootlocalhost export]# cd apache-zookeeper-3.7.0-bin/ [rootlocalhost apache-zookeeper-3.7.0-bin]# ls bin conf…

利用人工智能打破應試教育慣性促進學生思維活化與創新能力培養的研究

全文均為人工智能獨立研究完成 應試教育導致學生迷信標準答案慣性導致思維僵化-移動機器人-CSDN博客 用AI魔法打敗AI魔法-CSDN博客 課題名稱建議&#xff1a;“利用人工智能打破應試教育慣性&#xff0c;促進學生思維活化與創新能力培養研究”。 這個課題名稱明確指出了研究的…

高斯消元(完全主元法 and 部分主元法) C++代碼

部分主元法高斯消元 /* 算法步驟&#xff1a;1.枚舉每一列&#xff0c;找到絕對值最大的一行2.將該行和第一行交換3.將該行行首置為一4.將下面所有行第 i 列置為零 */#include <iostream> #include <cmath>using namespace std; const int N 109; const double e…

Linux內核的內存管理

Linux內核源碼內存管理主要包括以下幾個部分&#xff1a; 1. 物理內存管理&#xff1a;這部分主要負責將物理內存劃分為不同的頁表項&#xff0c;以便操作系統能夠快速地訪問和操作內存。 2. 虛擬內存管理&#xff1a;這部分主要負責將用戶空間的地址映射到物理內存中&#x…

linux之進程地址空間

文章目錄 1.進程地址空間回顧1.1進程地址空間劃分1.2驗證進程地址空間劃分1.簡單劃分2.完整劃分 2.初探進程地址空間2.1初看現象2.2Makefile的簡便寫法 3.進程地址空間詳解3.1地址空間是什么?3.2地址空間的設計/由來3.3空間區域劃分3.4如何理解地址空間?3.5解釋3.2的&#x1…

警惕.locked勒索病毒,您需要知道的預防和恢復方法。

尊敬的讀者&#xff1a; 隨著網絡技術的進步&#xff0c;勒索病毒已經成為一種極具威脅性的網絡犯罪工具之一。其中&#xff0c;.locked勒索病毒是一種采用高級加密算法的惡意軟件&#xff0c;目的是加密用戶的文件&#xff0c;并勒索贖金以提供解密密鑰。本文將介紹如何應對被…

解決No Feign Client for loadBalancing defined,修改Maven依賴

Spring微服務報錯&#xff1a; java.lang.IllegalStateException:FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-netf…

你不知道的庫:庫的種類,作用和加載方式

你不知道的庫&#xff1a;庫的種類&#xff0c;作用和加載方式 &#x1f4df;作者主頁&#xff1a;慢熱的陜西人 &#x1f334;專欄鏈接&#xff1a;Linux &#x1f4e3;歡迎各位大佬&#x1f44d;點贊&#x1f525;關注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客…

組件化——組件的實現原理

渲染器主要負責將虛擬 DOM 渲染為真實 DOM&#xff0c;我們只需要使用虛擬 DOM 來描述最終呈現的內容即可。但當我們編寫比較復雜的頁面時&#xff0c;用來描述頁面結構的虛擬 DOM 的代碼量會變得越來越多&#xff0c;或者說頁面模板會變得越來越大。這時&#xff0c;我們就需要…

iperf3 網絡測試

iperf3 測試網絡的上下行帶寬 下載地址 https://iperf.fr/iperf-download.php 開啟服務器 開啟客戶端 常用命令 -c 代表客戶端-s 代表服務端-u 代表 udp-r 代表數據方向是否反向 https://baijiahao.baidu.com/s?id1731514357681464971&wfrspider&forpc

C++學習 --queue

目錄 1&#xff0c; 什么是queue 2&#xff0c; 創建queue 2-1&#xff0c; 標準數據類型 2-2&#xff0c; 自定義數據類型 2-3&#xff0c; 其他創建方式 3&#xff0c; 操作stack 3-1&#xff0c; 賦值 3-2&#xff0c; 插入元素(push) 3-3&#xff0c; 查詢元素 3…

Python簡直是萬能的,這5大主要用途你一定要知道!

從2015開始國內就開始慢慢接觸Python了&#xff0c;從16年開始Python就已經在國內的熱度更高了&#xff0c;目前也可以算的上"全民Python"了。 眾所周知小學生的教材里面已經有Python了&#xff0c;國家二級計算機證也需要學習Python了&#xff01; 因為Python簡單…

編程語言發展史:布爾代數和機器語言

布爾代數是一種數學理論&#xff0c;用于描述和分析邏輯和布爾值的關系。它是由英國數學家George Boole在19世紀中期發明的&#xff0c;被認為是現代計算機科學的基礎之一。布爾代數的發明使得邏輯運算可以被表示為代數運算&#xff0c;從而為計算機科學的發展奠定了基礎。 在…