ステップ1:ステータスの定義
アイデア:テンプレート質問のサブシーケンスの問題は、「最長の上昇シーケンス」を体験することで、この問題を解決するには教えてくれる:末尾の数字は非常に重要です。注:最も長いシーケンスは、連続する必要はありません。
dp[i][0]
:で表すi
末端に数厳密に増加するシーケンスの長さであり;
dp[i][1]
:で表さi
端降下厳密な配列の長さは数です。
ステップ2:状態遷移方程式
dp[i][0] = dp[i - 1][1] + 1, if nums[i] - nums[i - 1] > 0
dp[i][1] = dp[i - 1][0] + 1, if nums[i] - nums[i - 1] < 0
議論をソートすることが分かる、2例が最も簡単です:
1、nums[i] - nums[i - 1] > 0
2、nums[i] - nums[i - 1] < 0
3、nums[i] - nums[i - 1] = 0
厳密にはアップまたはダウン状態が直接、直接その上の段階からコピーされたとき。
ステップ3:思考の初期化
初期化:dp[0][0] = 1,dp[0][1] = 1
。
ステップ4:思考出力
ときに最大の最後のステージの2つの状態値の出力。
Javaコード:
import java.util.Arrays;
public class Solution {
public int wiggleMaxLength(int[] nums) {
int len = nums.length;
if (len < 2) {
return len;
}
int[][] dp = new int[len][2];
dp[0][0] = 1;
dp[0][1] = 1;
for (int i = 1; i < len; i++) {
if (nums[i - 1] < nums[i]) {
// 结尾时候的状态是严格上升的
dp[i][0] = dp[i - 1][1] + 1;
dp[i][1] = dp[i - 1][1];
} else if (nums[i - 1] > nums[i]) {
// 结尾时候的状态是严格下降的
dp[i][1] = dp[i - 1][0] + 1;
dp[i][0] = dp[i - 1][0];
} else {
dp[i][0] = dp[i - 1][0];
dp[i][1] = dp[i - 1][1];
}
}
return Math.max(dp[len - 1][0], dp[len - 1][1]);
}
}
ステップ5:圧縮された状態を考えます
順方向電流ラインの基準値は、あなたがスクロール配列を使用することができます。
直接ダウン一次元の、それも可能です。また、これはコピーに操作する必要がなくなります。
Javaコード:
class Solution {
public int wiggleMaxLength(int[] nums) {
int len = nums.length;
if (len < 2) {
return len;
}
int[] dp = new int[2];
dp[0] = 1;
dp[1] = 1;
for (int i = 1; i < len; i++) {
if (nums[i - 1] < nums[i]) {
// 结尾时候的状态是严格上升的
dp[0] = dp[1] + 1;
} else if (nums[i - 1] > nums[i]) {
// 结尾时候的状态是严格下降的
dp[1] = dp[0] + 1;
}
}
return Math.max(dp[0], dp[1]);
}
}