最もホットな質問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回のトラバーサルで問題を解決できます。