如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第乙個差(如果存在的話)可能是正數或負數。少於兩個元素的序列也是擺動序列。
例如, [1,7,4,9,2,5] 是乙個擺動序列,因為差值 [6,-3,5,-7,3] 是正負交替出現的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是擺動序列,第乙個序列是因為它的前兩個差值都是正數,第二個序列是因為它的最後乙個差值為零。
給定乙個整數序列,返回作為擺動序列的最長子序列的長度。 通過從原始序列中刪除一些(也可以不刪除)元素來獲得子串行,剩下的元素保持其原始順序。
示例1
輸入:
[1,7,4,9,2,5]
輸出:6
解釋:整個序列均為擺動序列。
示例2
輸入:
[1,17,5,10,13,15,10,5,16,8]
輸出:7
解釋:這個序列包含幾個長度為 7 擺動序列,其中乙個可為[1,17,10,13,10,16,8]。
示例3
輸入:
[1,2,3,4,5,6,7,8,9]
輸出:2
這題題面說的囉裡囉唆的,其實就一句話:給你乙個序列,找出最長的乙個子串行,其中子串行相鄰兩個數的大小是波形的(也就是大小大小大等等這樣的)。
用 dfs 列舉所有可能的子串行,然後看最長的是多少,這種方法顯然會超時。
其實看到這道題,我第乙個想到了最長上公升子串行,這不就變了個形式嘛,於是動態規劃解法直接就有了。用如果
然後取陣列中最大值就是答案了,時間複雜度
換個定義,用
這裡分為幾種情況:
綜上考慮,時間複雜度可以降為
在上面優化的基礎上,我們還可以觀察到,每一次
其實這題還可以直接貪心做,考慮一段連續的上公升序列,最優子串行一定是包括了首尾兩個數的,因為首是最小的數,選了它才能給前乙個數留出更大的上公升空間,而尾是最大的數,選了它才能給下乙個數留出更多的下降空間。
所以我們貪心的掃瞄一遍陣列,遇到上公升或者下降的轉折點就選取這個數。而如果陣列不公升不降,也就是不變的話,就不用管它,因為這些相同的數裡面只需要選取乙個就行了。
時間複雜度是
class
solution
}res
=max
(res,dp
[i][0
]);res
=max
(res,dp
[i][1
]);}
return
res;
}};
class
solution
else
}return
max(dp[
n-1][
0],dp[
n-1][
1]);
}};
class
solution
else
}return
max(dp[
0][0],
dp[0][
1]);
}};
class
solution
return
res;
}};
鼠年快樂,新年獻給大家的第一道題,盡量寫的詳細一點。
官方題解沒有嚴謹的證明,雖然方法也是這 5 種,但是沒有說清楚,不能令人信服。
每日演算法系列 7
建立三個指標,分別指著head前乙個結點pre,head,head後乙個結點next。初始化pre,使得pre先指著位於鍊錶頭部外部空間,設為null,next也設為null但並不存在指向者。首先先將next指向head.next,用於儲存head的下乙個結點,使得鍊錶轉向不會因為鍊錶斷裂而丟失he...
每日演算法系列 LeetCode 386 字典序排數
給定乙個整數 n,返回從 1 到 n 的字典順序。例如,給定 n 13,返回 1,10,11,12,13,2,3,4,5,6,7,8,9 請盡可能的優化演算法的時間複雜度和空間複雜度。輸入的資料 n 小於等於 5,000,000。首先把 1 到 n 所有整數的字串形式放進陣列,然後對這個字串陣列進行...
每日演算法系列 LeetCode 289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞具有乙個初始狀態 live 1 即為活細胞,或 dead 0 即為死細胞。每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 根據當前狀態,寫乙個函式來計算面板上細胞的下乙個 一次更新後的 狀態。下乙...