ダイナミックレンジの問題の配列を計画

そこに大きな問題があると、特定の状態遷移ルールを示す特性の間に小さな問題を発見し、次いで溶液の条件を満たすように小さな問題を設計し、そして最後に、メモリ内の中間値迅速最終的な解決策を得ます

アレイ間隔問題は、動的プログラミングの問題で、私たちは、一般的な問題解決のアイデアの最初のを見て、動的計画問題を借りることができます

範囲合計問合せ

 

整数配列所与  NUMS、インデックス間の要素の和を見つける  I  及び  J  (I  ≤  J)、包括的です。

 

例:

 

 

この問題を解決すること与えられ、2つのインデックス間の配列は、それが明確な和= DP [J + 1]である - [I] DP次のように、コードを得ることができます。

    プライベート int型[] DP;
    プライベート NumArray(INT [] NUMS){ 
        DP = 新しい INT [nums.length + 1 ]。
        DP [ 0] = 0 ;
        以下のためにINT I 0 =; I <nums.length; I ++ ){ 
            DP [I +1] = NUMS [I] + DP [I]。
        } 
    } 

    プライベート INT sumRange(INT I、int型のJ){
         戻り DP [J + 1] - DP [I]。
    }

2番目の質問

算術スライス

 

 

 

这道题就有点复杂了,设A=[0,1,2,3,4],我们先设dp[i]是以A[i]为结尾的等差递增子区间的个数,当 A[i] - A[i-1] == A[i-1] - A[i-2],那么 [A[i-2], A[i-1], A[i]] 构成一个等差递增子区间。而且在以 A[i-1] 为结尾的递增子区间的后面再加上一个 A[i],一样可以构成新的递增子区间。

综上,在 A[i] - A[i-1] == A[i-1] - A[i-2] 时,dp[i] = dp[i-1] + 1。

因为递增子区间不一定以最后一个元素为结尾,可以是任意一个元素结尾,因此需要返回 dp 数组累加的结果。

代码如下所示:

 

    private int numberOfArithmeticSlices(int[] A){
        if (A == null || A.length == 0) {
            return 0;
        }
        int n = A.length;
        int[] dp = new int[n];
        for (int i = 2; i < n; i++) {
            if (A[i] - A[i - 1] == A[i - 1] - A[i - 2]) {
                dp[i] = dp[i - 1] + 1;
            }
        }
        int total = 0;
        for (int cnt : dp) {
            total += cnt;
        }
        return total;
    }

 

参考文献:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92.md#2-%E6%95%B0%E7%BB%84%E4%B8%AD%E7%AD%89%E5%B7%AE%E9%80%92%E5%A2%9E%E5%AD%90%E5%8C%BA%E9%97%B4%E7%9A%84%E4%B8%AA%E6%95%B0

 

おすすめ

転載: www.cnblogs.com/lybnumber6/p/12173855.html