这道题挺简单的,看完题脑子里出现的想法就是用一个sum来把数组从前往后加,如果sum小于0,那么对于和来说是会减小的,所以这个时候直接把sum归零,然后从这个位置再往后加,用一个max_sum来记录sum的最大值,最后返回这个max_sum就行,但是如果数组中所有数都是负数,那sum就一直都是0而正确的数是其中的最大的一个负数,所以我用一个max_num来记录其中最大的数。如果max_num<0说明全是负数,这时候max_sum=0,max_sum>max_num,所以无论是不是全是负数,最后返回max_num和max_sum的最大值就行。以下是我的代码:
class Solution {
public int maxSubArray(int[] nums) {
int length = nums.length;
int sum = nums[0];
int max_sum =sum;
int max_num = nums[0];
for(int i =1;i<length;i++){
if(sum<0)sum=0;
sum+=nums[i];
max_sum = Math.max(sum, max_sum);
max_num = Math.max(nums[i], max_num);
}
return max_sum > max_num ? max_sum : max_num;
}
}
写完看了一下题解:原理是一样的,但是它的代码更简洁
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0, maxAns = nums[0];
for (int x : nums) {
pre = Math.max(pre + x, x);
maxAns = Math.max(maxAns, pre);
}
return maxAns;
}
}
pre表示以第i-1个数结尾的最大和,如果pre加上nums[i]比num[i]大,那么pre就再加上num[i],否则pre就等于nums[i],这样就可以找到以每个数结尾的最大和,用一个maxAns记录所有和里面最大的,遍历的同时不断维护这个maxAns,最后返回maxAns即可。