easy list的第五题,这个题蛮有意思的。
我贴出来test case 1
Input: nums = [-2,1,-3,4,-1,2,1,-5,4] Output: 6 Explanation: The subarray [4,-1,2,1] has the largest sum 6.
其实这个主要步骤就是找最大,从左向右,从右向左都一样。如果和大于其他和,那么这个和就是最大的,如果和小于值,那这个值或许就是最大的,极端点的例子[-1,-2,-3,-4,1,-3,-2]。恐怕最大子数组应该就是3了。写成代码逻辑基本是:
sum+=nums[i]
nums[i]>sum max=nums[i]
Math.max(sum, max)
其实应该可以写成Math.max(max, Math.max(sum,nums[i]))
代码如下:
public int maxSubArray(int[] nums) {
int max_value = Integer.MIN_VALUE, sum = 0;
if(nums.length<1){
return nums.length==0 ? nums[0] : 0;
}else{
for(int i=nums.length-1; i>=0; i--){
sum += nums[i];
if(nums[i] > sum){
sum = nums[i];
}
if(sum > max_value){
max_value = sum;
}
}
return max_value;
}
在leetcode看到一个不用对比nums[i]和sum的,直接在max赋值之后sum如果小于0归0,也很巧妙,如果这个元素之前的总和为0,那么完全可以由他算起,就算全部都是负数,最大的负数也已经存在于max这个赋值中。