日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划——最长湍流子数组

發(fā)布時間:2023/12/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划——最长湍流子数组 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題來源:leetcode 978。

最長湍流子數(shù)組

當(dāng) A 的子數(shù)組 A[i], A[i+1], ..., A[j] 滿足下列條件時,我們稱其為湍流子數(shù)組:

  • 若 i <= k < j,當(dāng) k 為奇數(shù)時,A[k] > A[k+1],且當(dāng) k 為偶數(shù)時,A[k] < A[k+1];
  • 若 i <= k < j,當(dāng) k 為偶數(shù)時,A[k] > A[k+1],且當(dāng) k 為奇數(shù)時,A[k] < A[k+1]。
    也就是說,如果比較符號在子數(shù)組中的每個相鄰元素對之間翻轉(zhuǎn),則該子數(shù)組是湍流子數(shù)組。

返回 A 的最大湍流子數(shù)組的長度。

示例 1:

輸入:[9,4,2,10,7,8,8,1,9] 輸出:5 解釋:(A[1] > A[2] < A[3] > A[4] < A[5])

示例 2:

輸入:[4,8,12,16] 輸出:2

示例 3:

輸入:[100] 輸出:1

提示:

  • 1 <= A.length <= 40000
  • 0 <= A[i] <= 10^9

動態(tài)規(guī)劃

優(yōu)化子結(jié)構(gòu)設(shè)以 arr[i]arr[i]arr[i] 為結(jié)尾的最長湍流子數(shù)組的長度為 nnn,證明該問題的最優(yōu)解包含其子問題的最優(yōu)解,或者說該問題的最優(yōu)解可以由其子問題的最優(yōu)解構(gòu)造得到:

  • 如果 arr[i]==arr[i?1]arr[i] == arr[i-1]arr[i]==arr[i?1],那么以 arr[i]arr[i]arr[i] 為結(jié)尾的最長湍流子數(shù)組的長度為 111,不需要子問題的解。
  • 如果 arr[i]>arr[i?1]arr[i] > arr[i-1]arr[i]>arr[i?1]arr[i?1]<arr[i?2]arr[i-1] < arr[i-2]arr[i?1]<arr[i?2],那么 n?1n-1n?1 是子問題(以 arr[i?1]arr[i-1]arr[i?1] 為結(jié)尾的數(shù)組)的最長湍流子數(shù)組的長度,也就是說只需要求解該子問題。可以通過反證法證明:假設(shè)子問題的最長湍流子數(shù)組的長度大于 n?1n-1n?1,那么又因為 arr[i]>arr[i?1]arr[i] > arr[i-1]arr[i]>arr[i?1]arr[i?1]<arr[i?2]arr[i-1] < arr[i-2]arr[i?1]<arr[i?2],所以 arr[i]arr[i]arr[i] 可以接在該湍流子數(shù)組的后面,所以以 arr[i]arr[i]arr[i] 為結(jié)尾的最長湍流子數(shù)組的長度就大于 nnn,與假設(shè)矛盾。
  • 如果 arr[i]<arr[i?1]arr[i] < arr[i-1]arr[i]<arr[i?1]arr[i?1]>arr[i?2]arr[i-1] > arr[i-2]arr[i?1]>arr[i?2],那么 n?1n-1n?1 是子問題(以 arr[i?1]arr[i-1]arr[i?1] 為結(jié)尾的數(shù)組)的最長湍流子數(shù)組的長度,證明過程與前面相同。
  • 對于其他情況(arr[i]>arr[i?1]>arr[i?2]arr[i] > arr[i-1] > arr[i-2]arr[i]>arr[i?1]>arr[i?2]arr[i]<arr[i?1]<arr[i?2]arr[i] < arr[i-1] <arr[i-2]arr[i]<arr[i?1]<arr[i?2]),那么無論以 arr[i?1]arr[i-1]arr[i?1] 為結(jié)尾的最長湍流子數(shù)組的長度為多少,以 arr[i]arr[i]arr[i] 結(jié)尾的最長湍流子數(shù)組的長度為 2。
  • 還有 arr[i?2]arr[i-2]arr[i?2] 不存在的情況,只需要看 arr[i]arr[i]arr[i]arr[i]arr[i]arr[i] 是否相等,就可以得到原問題的解。

重疊子問題:簡單地使用遞歸算法來求解,很容易發(fā)現(xiàn)具有子問題被重復(fù)計算。

遞歸地定義最優(yōu)解的值設(shè) dp[i]dp[i]dp[i] 表示以 arr[i]arr[i]arr[i] 結(jié)尾的最長湍流子數(shù)組的長度,對于數(shù)組的每個位置 iii,以該位置元素結(jié)尾的最長湍流子數(shù)組的長度計算過程如下:

  • 首先初始化 dpdpdp 數(shù)組的所有位置都為 111
  • 如果 dp[i?1]dp[i-1]dp[i?1] 為 1:
    • 如果 arr[i]≠arr[i?1]arr[i] \neq arr[i-1]arr[i]?=arr[i?1] 時,dp[i]=2dp[i]=2dp[i]=2
    • 否則保持 111 不變。
  • 否則:
    • 如果 arr[i]>arr[i?1]arr[i] > arr[i-1]arr[i]>arr[i?1]arr[i?1]<arr[i?2]arr[i-1] < arr[i-2]arr[i?1]<arr[i?2]arr[i]<arr[i?1]arr[i] < arr[i-1]arr[i]<arr[i?1]arr[i?1]>arr[i?2]arr[i-1] > arr[i-2]arr[i?1]>arr[i?2],那么 dp[i]=dp[i?1]+1dp[i] = dp[i-1] + 1dp[i]=dp[i?1]+1
    • 否則看 arr[i?1]arr[i-1]arr[i?1]arr[i]arr[i]arr[i] 是否相等,不相等的話將 dp[i]dp[i]dp[i] 的值置為 222

自底向上地計算最優(yōu)解的值:只需要從前向后遍歷數(shù)組,便可以確保每一個問題計算時,其相關(guān)的子問題均已經(jīng)被計算了出來。

class Solution { public:int maxTurbulenceSize(vector<int>& arr) {int n = arr.size();if(n == 1) {return 1;}vector<int> dp(n, 1);for(int i = 1; i<n; i++) {if(dp[i-1] == 1) {dp[i] = arr[i-1] == arr[i] ? 1 : 2;} else if(arr[i] != arr[i-1]) {if((arr[i] > arr[i-1] && arr[i-1] < arr[i-2]) || (arr[i] < arr[i-1] && arr[i-1] > arr[i-2])) {dp[i] = dp[i-1] + 1;} else {dp[i] = 2;}}}return *max_element(dp.begin(), dp.end());} };

空間優(yōu)化:注意到每個 dp[i]dp[i]dp[i] 只與 dp[i?1]dp[i-1]dp[i?1] 相關(guān),所以可以通過一個變量來表示 dpdpdp 數(shù)組,另外再通過一個變量保存當(dāng)前最長湍流子數(shù)組的長度即可。

class Solution { public:int maxTurbulenceSize(vector<int>& arr) {int n = arr.size();if(n == 1) {return 1;}int result = 1, temp = 1;for(int i = 1; i<n; i++) {if(temp == 1) {temp = arr[i-1] == arr[i] ? 1 : 2;} else if(arr[i] != arr[i-1]) {if((arr[i] > arr[i-1] && arr[i-1] < arr[i-2]) || (arr[i] < arr[i-1] && arr[i-1] > arr[i-2])) {temp++;} else {temp = 2;}}result = temp > result ? temp : result;}return result;} };

總結(jié)

以上是生活随笔為你收集整理的动态规划——最长湍流子数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。