LeetCode 376タイトル:スイングシーケンス(動的計画法)

ステップ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]);
    }
}
公開された442元の記事 ウォンの賞賛330 ビュー123万+

おすすめ

転載: blog.csdn.net/lw_power/article/details/103970211