當 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
輸出: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指的是 法,而非編寫電腦程式。動態規劃將問題分成若干個相互重疊的子問題,遞迴的求解子問題,儲存子問題的解,再將它們的解組合起來,求出原問題的解。實際操作中,記錄下子問題的結果,儲存在乙個 中,使得公共的子問題只需要計算一...