1. 題目
給你一個整數數組 nums ,請你找出一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
子數組是數組中的一個連續部分。
示例 1:
輸入:nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出:6
解釋:連續子數組 [4,-1,2,1] 的和最大,為 6 。
示例 2:
輸入:nums = [1]
輸出:1
示例 3:
輸入:nums = [5,4,-1,7,8]
輸出:23
2. 題解
class Solution {public int maxSubArray(int[] nums) {int ans = nums[0];int sum = 0;for(int num : nums){if(sum > 0){sum += num;}else{sum = num;}ans = Math.max(ans,sum);}return ans;}
}
3. 解析
出自這位老師:畫手大鵬:畫解算法:53. 最大子序和
- int ans = nums[0];
ans變量初始化為數組的第一個元素,這表示在遍歷開始時,默認的最大子數組和就是第一個元素。這是因為如果所有數都是負數的情況,最大值只能是其中最大的那個。 - int sum = 0;
sum變量用于跟蹤當前正在考慮的連續子數組的和,初始化為0。這個初始值表示在遍歷開始時還沒有累加任何元素。 - for(int num : nums)循環體
這是一個遍歷整個nums數組的循環,使用的是數組遍歷的常見方式。
int num : nums:將循環變量num賦值為當前遍歷的nums數組中的元素。 - if(sum > 0){ sum += num; } else { sum = num; }
這里的條件判斷用于決定如何更新sum:
如果當前累積和sum大于0:這意味著繼續向當前子數組中添加num不會使總和變為負數,反而可能會增加。因此,將num加到sum上。
否則(即sum <=0):意味著繼續向當前子數組添加num會導致總和不增大或者變成負數。為了尋找可能更大的子數組和,應該重新開始一個新的子數組,其值就是當前的num。 - ans = Math.max(ans, sum);
在每一步循環中,更新ans為當前最大值與當前sum的最大值。
Math.max(ans, sum) 比較當前最大的ans和當前的sum,取較大的那個作為新的ans。 - }結束循環
結束for循環,繼續處理下一個元素。 - return ans;
返回最終的ans值,即整個數組的最大子數組和。