leecode 978 動態規劃 最長湍流子陣列

2021-10-21 21:15:27 字數 3065 閱讀 6700

當 a 的子陣列 a[i], a[i+1], …, a[j] 滿足下列條件時,我們稱其為湍流子陣列:

若 i

<=k

<

ji <= k < j

i<=k

<

j,當 k

kk 為奇數時, a[k

]>a[

k+1]

a[k] > a[k+1]

a[k]

>a[

k+1]

,且當 k 為偶數時,a[k

]

k+1]

a[k] < a[k+1]

a[k]

k+1]

;或 若 i

<=k

<

ji <= k < j

i<=k

<

j,當 k

kk 為偶數時,a[k

]>a[

k+1]

a[k] > a[k+1]

a[k]

>a[

k+1]

,且當 k 為奇數時, a[k

]

k+1]

a[k] < a[k+1]

a[k]

k+1]

。也就是說,如果比較符號在子陣列中的每個相鄰元素對之間翻轉,則該子陣列是湍流子陣列。

返回 a 的最大湍流子陣列的長度。

示例:

輸入:[9,4,2,10,7,8,8,1,9]

輸出:5

解釋:(a[1] > a[2] < a[3] > a[4] < a[5])

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

輸出:2

輸入:[100]

輸出:1

題目的意思是,如果乙個數,比左邊的數小,那麼他也比右邊的數小;如果乙個數,比左邊的數大,那麼他也比右邊的數大。

使用動態規劃的做法,計算arr

arrar

r每個位置的最大湍流子陣列的長度。

首先構建也給表示每個位置最大湍流子陣列長度的陣列 dp=

[1]∗

len(

arr)

dp = [1] * len(arr)

dp=[1]

∗len

(arr

)我們用fla

gflag

flag

來表示當前數和前一位的大小關係,比如假設如果arr

[i

]>ar

r[i−

1]

arr[i] > arr[i-1]

arr[i]

>ar

r[i−

1],那麼fla

g=tr

ue

flag = true

flag=t

rue。那麼每次fla

gflag

flag

都應該做一次反操作fla

g=no

tfla

gflag = not\ flag

flag=n

otfl

ag判斷a rr

[i]和

arr[

i−1]

arr[i]和arr[i-1]

arr[i]

和arr

[i−1

]的關係。如果此時arr

[i]和

arr[

i−1]

arr[i]和arr[i-1]

arr[i]

和arr

[i−1

]不滿足題目要求。則此時重新開始第二步操作且flag重新設定,fla

g=(a

rr[i

]>ar

r[i−

1]

)flag = (arr[i] > arr[i - 1])

flag=(

arr[

i]>ar

r[i−

1])。

class

solution

(object):

defmaxturbulencesize

(self, arr)

:"""

:type arr: list[int]

:rtype: int

"""iflen

(arr)==1

:return

1 dp =[1

]*len(arr)

if arr[1]

!= arr[0]

: dp[1]

+=1# print('dp[1]', dp[1])

iflen

(arr)

>

1: flag =

(arr[1]

> arr[0]

)for i in

range(2

,len

(arr)):

if flag:

if arr[i]

< arr[i -1]

: dp[i]

= dp[i -1]

+1flag =

not flag

else

: flag =

(arr[i]

> arr[i -1]

)if arr[i]

!= arr[i-1]

: dp[i]+=1

else

:if arr[i]

> arr[i -1]

: dp[i]

= dp[i -1]

+1flag =

not flag

else

:if arr[i]

!= arr[i-1]

: dp[i]+=1

flag =

(arr[i]

> arr[i -1]

)# print(dp)

return

max(dp)

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...

動態規劃學習(一) 最值型

例題1 硬幣組合問題 動態規劃組成部分一 確定狀態 動態規劃組成部分二 轉移方程 動態規劃組成部分三 初始條件和邊界情況 小結lintcode 669 想法1 盡量用大的硬幣 結果是 7 7 7 21 21 2 2 2 27,共6枚硬幣 正確答案 7 5 5 5 5 27,5枚硬幣 對於例題1,關鍵...

最簡單的動態規劃題,木有之一

動態規劃英文名為dynamic programming,其中pogramming指的是 法,而非編寫電腦程式。動態規劃將問題分成若干個相互重疊的子問題,遞迴的求解子問題,儲存子問題的解,再將它們的解組合起來,求出原問題的解。實際操作中,記錄下子問題的結果,儲存在乙個 中,使得公共的子問題只需要計算一...