每日演算法系列 LeetCode 376 擺動序列

2021-10-02 09:00:17 字數 1828 閱讀 8015

如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第乙個差(如果存在的話)可能是正數或負數。少於兩個元素的序列也是擺動序列。

例如, [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 即為死細胞。每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 根據當前狀態,寫乙個函式來計算面板上細胞的下乙個 一次更新後的 狀態。下乙...