當 a 的子陣列 a[i], a[i+1], …, a[j] 滿足下列條件時,我們稱其為湍流子陣列:
也就是說,如果比較符號在子陣列中的每個相鄰元素對之間翻轉,則該子陣列是湍流子陣列。
返回a
的最大湍流子陣列的長度。
解題思路:這道題要我們找到乙個子陣列,該子陣列所有兩個相鄰的資料是一大一小的,因此我們可以用乙個一維的dp陣列,該陣列的含義是,以它為最後的乙個數字的端流子陣列的長度,因此我們可以得到乙個動態轉移方程
dp[i] = dp[i-1]+1,當a[i]跟前面a[i-1]能夠形成端流子陣列時
dp[i] = 2, 如果跟前面的無法形成端流子陣列,但是跟前面的值不相等,那就跟前面乙個數重新組成端流子陣列
dp[i] = 1, 如果a[i]跟前面的值相同,那這時候要跟前面組成端流子陣列也沒辦法了,因此dp[i]只能等於1
我們看一下**實現部分,首先我們需要定義乙個flag標誌數字,flag的含義為a[i]應該小於a[i-1] (當flag=0)還是大於a[i-1] (當flag=1),當a[i-1] == a[i-2] 時,我們將flag置為-1,表示我們不知道應該將flag置為多少,讓a[i]跟a[i-1]比較後重新判斷首先初始化
dp[0] = 1; //首先,第乙個數字滿足端流子陣列,所以初始化為1
if(a[1]>a[0])
//如果a[1]大於a[0],那a[2]應該小於a[1],所以我們將flag置為0,0表示小於
else if(a[1]迴圈結構的**
for(int i=2; ia[i-1])
//如果滿足,那麼這個端流子陣列可以直接擴充套件乙個長度
else if(a[i]a[i-1])
dp[i] = 2;
else
}else // flag=-1,重新判斷flag
else
//這裡的操作跟初始時一模一樣
}max = math.max(max, dp[i]);
}
結果
這次是唯一一次自己做出來的,之前做了十幾道題,總是想不出來,都快懷疑自己做題有沒有用了,這次是一次提交一次過,算是有進步了^_^
978 最長湍流子陣列 動態規劃
978.最長湍流子陣列 author wsq date 2020 10 20 當 a 的子陣列 a i a i 1 a j 滿足下列條件時,我們稱其為湍流子陣列 若 i k j,當 k 為奇數時,a k a k 1 且當 k 為偶數時,a k a k 1 或 若 i k j,當 k 為偶數時,a k...
動態規劃 陣列中最長遞減子串行
求乙個陣列的最長遞減子串行比如的最長遞減子串行為 分析 典型的動態規劃題目,對每乙個數計算由它開始的最大遞減子串行的個數,並存放到一張對映表中。例如對陣列a n 有 然後利用求得的對映表及最大子串行個數獲取原陣列中的元素。對於我們求得最大子串行個數為nmaxlen 5,表為ptable 那麼ptab...
動態規劃 陣列中最長遞減子串行
求乙個陣列的最長遞減子串行比如的最長遞減子串行為 分析 典型的動態規劃題目,對每乙個數計算由它開始的最大遞減子串行的個數,並存放到一張對映表中。例如對陣列a n 有 然後利用求得的對映表及最大子串行個數獲取原陣列中的元素。對於我們求得最大子串行個數為nmaxlen 5,表為ptable 那麼ptab...