整数の配列numsが与えられた場合、合計が最大の連続したサブ配列を見つけて(サブ配列には少なくとも1つの要素が含まれています)、最大の合計を返します。サブ配列は、配列の連続した部分です。【LeetCodeHot100】

最もホットな質問100の質問53:

最初にコードを貼り付けます。

class Solution {
    public int maxSubArray(int[] nums) {
        //定义一个cur,存储子数组的和
        int cur = 0;
        //定义maxsum,为连续子数组的最大和
        int maxsum = nums[0];
        //for循环遍历数组,cur为从0开始的子数组和,若遍历到x时,之前子数组的和小于x的值
        //则抛弃之前的子数组,cur从当前的x开始计算新的子数组的和
        //maxsum记录每一个子数组之间的最大值!
        for (int x : nums) {
            cur = Math.max(cur + x, x);
            maxsum = Math.max(maxsum, cur);
        }
        //返回maxsum
        return maxsum;
    }
}

問題解決のアイデア:この質問では、連続するサブ配列の最大合計を見つける必要があります。サブ配列は連続している必要があります。つまり、添え字は連続的に増加します。ただし、タイトルにはサブ配列の特定のサイズは必要ありません。1つの要素または3つの要素の場合があります。わかりません。最も簡単で直感的な方法は、要素が1の場合にすべてのサブ配列を一覧表示することです。要素はすべてのサブ配列で2であり、以下同様に続き、最後にこれらのサブ配列間の合計の最大値を見つけます。しかし、このように書くのは面倒で、時間計算量も非常に高いので、さらに最適化できますか?

今述べた方法は、すべてのサブアレイをリストし、これらのサブアレイで最大の合計を見つけることです。次に、現在のサブ配列の合計を表す変数curを定義できます。curは0から始まり、要素の値を順番に追加します。サブ配列とcurの合計にi添え字の値を加えたものが、iに移動するときにi添え字の値よりも小さい場合は、curをiから開始します。 subscript前の連続する要素の合計は、新しいサブ配列の最初の要素の値よりもすでに小さいため、新しいサブ配列の合計を計算します。

これにより、1回のトラバーサルで問題を解決できます。

おすすめ

転載: blog.csdn.net/weixin_56960711/article/details/123280785