代碼隨想錄訓練營打卡第36天:動態規劃解決子序列問題

1.300最長遞增子序列

1.問題描述

找到其中最長嚴格遞增子序列的長度。

子序列?是由數組派生而來的序列,刪除(或不刪除)數組中的元素而不改變其余元素的順序。

2.問題轉換

從nums[0...i]的最長的遞增的子序列

3.解題思路

  1. 每一個位置的nums[i]都有兩種狀態:是否放入
  2. 對于放入狀態:找到從[0..j](j<i)之間的遞增子序列,如果滿足遞增,放入子序列中,找到其中最長的那個遞增子序列,更新長度。
  3. 對于不放入狀態:如果不滿足遞增,則不放入。

4.為什么使用動態規劃?

因為從[0..i]的最長的遞增子序列狀態一定是由[0..j]的狀態遞推出來,所以考慮使用動態規劃的方法。

5.動態規劃的具體實現

  1. dp[j]數組的含義:代表的是從nums[0..j]的最長遞增子序列。
  2. 遞推公式:for(int i = 0;i<j;i++){? ? ? ? if(nums[j]>nums[i]){//首先需要滿足遞增? ? ? ? ? ? ? ? ? ? dp[j] = max(dp[j],dp[i]+1);//從中選擇最長的作為最長遞增子序列.dp[i] +1:其中i可以等效為背包問題里面的j-weight[i],1可以等效為背包問題里面的value[i].? ? ? ? ? ? ? }? ? ? ? ? }
  3. 初始化:默認情況下每個的都是1,因為自身可以當做唯一的那一個遞增子序列。
  4. 遍歷順序:由遞推公式可以知道,應該是滿足從小到大的方式進行遍歷。

6.進階:使用動態規劃和二分法來解決

1.思路

我們使用一個數組tail用來存放從[0..i]的單調遞增數組的尾數(而且對應的nums[i]越小越好),tail[i]代表的是尾數,i代表的是長度。

2.具體實現

1.遍歷數組得到此時的nums[i],根據nums[i]在tail數組中找到能夠滿足的最左側的位置。

2.最左側的位置的查找:使用二分法來找到滿足嚴格遞增的最長的長度。可能會出現兩種情況:

? ? ? ? 1.left<res(即在tails的范圍內)當tails[mid]<nums[i],tails[left]>nums[i]:此時將tails[left] = nums[i],可以保證在后面運行的時候能夠盡可能的找到更長的長度。

? ? ? ? 2.當left == res(即這個數比最右側的那個遞增的都長)。此時res++;tails[left] = nums[i].

3.最后的返回值就是對應的一個res的長度。

class Solution {
public:int lengthOfLIS(vector<int>& nums) {/*//方法1:動態規劃int n = nums.size();vector<int> dp(n,1);//dp[j]:從0-j數組的最長的遞增子序列int result = 1;for(int j = 1;j<n;j++){for(int i = 0;i<j;i++){if(nums[j]>nums[i]){dp[j] = max(dp[j],dp[i]+1);}}if(result<dp[j])result = dp[j];}return result;*///方法2:動態規劃+二分查找int n = nums.size();vector<int> tails(n,0);//用來存放一個單調遞增的數組的尾數int res = 0;//代表的是單調遞增的最大長度for(auto num:nums){//用于在tail數組中找到需要替換的那個位置tails[i]<num<tails[i+1],此時將其替換為tails[i+1] = num;//如果這個值在這個里面找不到,就放在最右邊,同時res++;int left = 0,right = res;while(left<right){//[left,right)循環不變量int mid = left +(right - left)/2;if(tails[mid]<num)left = mid+1;else right = mid;}tails[left] = num;if(res == right) res++;}return res;}
};

2.647最長連續遞增子序列

1.問題描述

找到其中最長連續遞增子序列的長度。

2.問題轉換

從nums[0...i]的最長的連續遞增的子序列

3.解題思路

  1. 每一個位置的nums[i]都有兩種狀態:是否放入
  2. 對于放入狀態:nums[i]>nums[i-1],則放入。
  3. 對于不放入狀態:如果不滿足遞增,則不放入。

4.為什么使用動態規劃?

因為從[0..i]的最長的遞增子序列狀態一定是由前一個的狀態遞推出來,所以考慮使用動態規劃的方法。

5.動態規劃的具體實現

  1. dp[j]數組的含義:代表的是從nums[0..j]的最長連續遞增子序列。(也可以將其表示為以i為結尾的最長的連續遞增子序列,然后求解得到最大值)
  2. 遞推公式:if(nums[i]>nums[i-1]){//滿足遞增才能添加
    ? ? ? ? ? ? ? ? tail[i] = tail[i-1]+1;
    ? ? ? ? ? ? }//if(result>tail[i])tail[i] = result;//比較找到最大值
  3. 初始化:默認情況下每個的都是1,因為自身可以當做唯一的那一個遞增子序列。
  4. 遍歷順序:由遞推公式可以知道,應該是滿足從小到大的方式進行遍歷。
class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {int n = nums.size();//vector<int> dp(n,1);vector<int> tail(n,1);int result = 1;int i = 0;for(int i = 1;i<n;i++){if(nums[i]>nums[i-1]){tail[i] = tail[i-1]+1;}}auto maxs =  max_element(tail.begin(),tail.end());return *maxs;/*for(int j = 1;j<n;j++){i = j;for(;i>0;i--){if(nums[i]<=nums[i-1]){break;}}dp[j] = max(dp[j-1],(j-i+1));//長度}return dp[n-1];*/}
};

3.718最長重復子數組

1.問題描述

找到其中最長重復子數組的長度。

2.問題轉換

按照順序遍歷,如果相同了就長度+1

3.解題思路

  1. 每一個位置的nums[i]都有兩種狀態:是否相等
  2. 對于相等狀態:即nums1[i-1] == nums2[j-1],此時長度+1,然后比較最大值,更新res
  3. 對于不相等狀態:比較最大值更新res
  4. 將最大值存放在res中

4.為什么使用動態規劃?

因為每一個位置的值都可以由前面的狀態或者當前的狀態確定。

5.動態規劃的具體實現

  1. dp[i][j]數組的含義:代表的是從nums1[0..i-1],nums2[0..j-1]的重復子數組長度。(
  2. 遞推公式:?if(nums1[i-1] == nums2[j-1]){dp[i][j] = dp[i-1][j-1]+1;}
  3. 初始化:默認情況下每個的都是1,因為自身可以當做唯一的那一個遞增子序列。
  4. 遍歷順序:由遞推公式可以知道,應該是滿足從小到大的方式進行遍歷。
  5. 最終結果存放在res中,因為res的含義是最長的重復子數組的長度。
class Solution {
public:int findLength(vector<int>& nums1, vector<int>& nums2) {int m = nums1.size();int n = nums2.size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));int res = 0;for(int i = 1;i<m+1;i++){for(int j = 1;j<n+1;j++){if(nums1[i-1] == nums2[j-1]){dp[i][j] = dp[i-1][j-1]+1;}if(dp[i][j]>res) res = dp[i][j];}}return res;}
};

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

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

相關文章

經濟學問題

問題1 1916年&#xff0c;福特汽車公司以440美元的價格生產了50萬輛T型福特汽車。該公司當年盈利6000萬美元。亨利福特告訴一位報紙記者&#xff0c;他打算把T型車的價格降至360美元&#xff0c;他希望在這個價格上能賣出80萬輛汽車。福特說&#xff1a;“每輛車的利潤減少&am…

Flutter 中的 CupertinoPicker 小部件:全面指南

Flutter 中的 CupertinoPicker 小部件&#xff1a;全面指南 在Flutter中&#xff0c;CupertinoPicker是一個用于創建iOS風格的選擇器的組件&#xff0c;它允許用戶通過滾動來選擇一個值。CupertinoPicker可以用于選擇日期、時間或者任何可枚舉的值。本文將詳細介紹CupertinoPi…

C++多態詳解

目錄 一、多態的概念 二、多態的定義及實現 1.多態的構成條件 2.虛函數 3.虛函數的重寫 4.例題理解&#xff08;超級重要&#xff0c;強烈建議做一下&#xff09; 5.C11 override和 final 6.重載、覆蓋&#xff08;重寫&#xff09;、隱藏&#xff08;重定義&#xff0…

【yijiej】mysql報錯 之 報錯:Duplicate entry 字段 for key ‘表名.idx_字段’

一、問題操作 Mysql 進行insert 操作&#xff0c;報錯&#xff1a;Duplicate entry 字段 for key ‘表名.idx_字段’ 原因解析&#xff1a;idx 是做的索引鍵&#xff0c;是具有唯一性二、問題原因&#xff08;三種情況&#xff0c;當前我遇到的情況是第一種&#xff09; 1、當 …

零基礎代碼隨想錄【Day42】|| 1049. 最后一塊石頭的重量 II,494. 目標和,474.一和零

目錄 DAY42 1049.最后一塊石頭的重量II 解題思路&代碼 494.目標和 解題思路&代碼 474.一和零 解題思路&代碼 DAY42 1049.最后一塊石頭的重量II 力扣題目鏈接(opens new window) 題目難度&#xff1a;中等 有一堆石頭&#xff0c;每塊石頭的重量都是正整…

(Qt) 默認QtWidget應用包含什么?

文章目錄 ?前言?創建&#x1f6e0;?選擇一個模板&#x1f6e0;?Location&#x1f6e0;?構建系統&#x1f6e0;?Details&#x1f6e0;?Translation&#x1f6e0;?構建套件(Kit)&#x1f6e0;?匯總 ?項目??概要??構建步驟??清除步驟 ?Code&#x1f526;untitled…

【EasyX】快速入門——消息處理,音頻

1.消息處理 我們先看看什么是消息 1.1.獲取消息 想要獲取消息,就必須學會getmessage函數 1.1.1.getmessage函數 有兩個重載版本,它們的作用是一樣的 參數filter可以篩選我們需要的消息類型 我們看看參數filter的取值 當然我們可以使用位運算組合這些值 例如,我們…

華為CE6851-48S6Q-HI升級設備版本及補丁

文章目錄 升級前準備工作筆記本和交換機設備配置互聯地址啟用FTP設備訪問FTP設備升級系統版本及補丁 升級前準備工作 使用MobaXterm遠程工具連接設備&#xff0c;并作為FTP服務器準備升級所需的版本文件及補丁文件 筆記本和交換機設備配置互聯地址 在交換機接口配置IP&#…

Facebook隱私保護:數據安全的前沿挑戰

在數字化時代&#xff0c;隨著社交媒體的普及和應用&#xff0c;個人數據的隱私保護問題日益受到關注。作為全球最大的社交平臺之一&#xff0c;Facebook承載了數十億用戶的社交活動和信息交流&#xff0c;但與此同時&#xff0c;也面臨著來自內外部的數據安全挑戰。本文將深入…

AWS Elastic Beanstalk 監控可觀測最佳實踐

一、概述 Amazon Web Services (AWS) 包含一百多種服務&#xff0c;每項服務都針對一個功能領域。服務的多樣性可讓您靈活地管理 AWS 基礎設施&#xff0c;然而&#xff0c;判斷應使用哪些服務以及如何進行預配置可能會非常困難。借助 Elastic Beanstalk&#xff0c;可以在 AW…

【LinuxC語言】一切皆文件的理念

文章目錄 引言一、什么是“一切皆文件”&#xff1f;1. 文件柜的類比2. 統一的操作方式3. 舉個具體例子4. 設備文件5. 進程和網絡連接6. 簡化管理 二、這一設計的優勢1. 統一接口2. 靈活性3. 簡化了系統管理4. 增強了系統安全性 結論 引言 Linux 操作系統以其獨特的設計理念和…

如何使用JMeter 進行全鏈路壓測

使用 JMeter 進行全鏈路壓測&#xff1a;詳細步驟指南 全鏈路壓測旨在測試整個系統的性能&#xff0c;包括所有的組件和服務。通過 Apache JMeter 進行全鏈路壓測&#xff0c;可以模擬真實用戶行為&#xff0c;測試系統在高負載下的表現。以下是詳細的步驟指南&#xff0c;分為…

AWTK實現汽車儀表Cluster/DashBoard嵌入式GUI開發(七):快啟

前言: 汽車儀表是人們了解汽車狀況的窗口,而儀表中的大部分信息都是以指示燈形式顯示給駕駛者。儀表指示燈圖案都較為抽象,對駕駛不熟悉的人在理解儀表指示燈含義方面存在不同程度的困難,尤其對于駕駛新手,如果對指示燈的含義不求甚解,有可能影響駕駛的安全性。即使是對…

Pytest框架實戰二

在Pytest框架實戰一中詳細地介紹了Pytest測試框架在參數化以及Fixture函數在API測試領域的實戰案例以及具體的應用。本文章接著上個文章的內容繼續闡述Pytest測試框架優秀的特性以及在自動化測試領域的實戰。 conftest.py 在上一篇文章中闡述到Fixture函數的特性&#xff0c;第…

shell循環

一、for循環 用法&#xff1a; for 變量 in 取值列表 do 命令序列 done 例1&#xff1a;打印1到10的數字列表 #!/bin/bashfor i in {1..10} do echo $i done 例2&#xff1a;#批量添加用戶,用戶名存放在users.txt文件中&#xff0c;每行一個,初始密碼均設為123456 #!/bin/bas…

KMP算法【C++】

KMP算法測試 KMP 算法詳解 根據解釋寫出對應的C代碼進行測試&#xff0c;也可以再整理成一個函數 #include <iostream> #include <vector>class KMP { private:std::string m_pat;//被匹配的字符串std::vector<std::vector<int>> m_dp;//狀態二維數組…

怎樣解決Redis高并發競爭Key難點?

Redis作為一種高性能的鍵值存儲系統&#xff0c;在現代分布式系統中發揮著重要作用。然而&#xff0c;高并發場景下對同一Key的操作可能引發競爭條件&#xff0c;給系統穩定性和數據一致性帶來挑戰。本文將探討如何解決這一問題&#xff0c;為讀者提供有效的應對策略。 1. Red…

【002】FlexBison實現原理

0. 前言 Flex和Bison是用于構建處理結構化輸入的程序的工具。它們最初是用于構建編譯器的工具&#xff0c;但它們已被證明在許多其他領域都很有用。 &#xfeff; 在第一章中&#xff0c;我們將首先看一點(但不是太多)它們背后的理論&#xff0c;然后我們將深入研究一些使用它…

Mysql和Postgresql創建用戶和授權命令

Mysql和Postgresql創建用戶和授權命令 MySQL/MariaDB/TiDB mysql -uroot -P3306 -p 輸入密碼&#xff1a;xxx create user user1% identified by xxx; grant all privileges on *.* to user1%; create user user2% identified by xxx; grant all privileges on *.* to user2%;…

Winform /C# 截圖當前窗體,指定區域,當前屏幕

1.當前窗體 public static Image CaptureControl(Control ctrl){System.Drawing.Bitmap bmp new System.Drawing.Bitmap(ctrl.Width, ctrl.Height);ctrl.DrawToBitmap(bmp, new Rectangle(0, 0, ctrl.Width, ctrl.Height));return bmp;}private void DownLoad(){string filePa…