1.题目
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
翻译:找到一个序列(至少包含一个数字)中的连续子序列,该子序列有最大的和。
例如,给定数组 [-2,1,-3,4,-1,2,1,-5,4]
,一个连续的子序列[4,-1,2,1]
有最大的和 6.
2.思路
nums为待求数组,用total记录当前遍历的加和,max记录当前计算的子串和最大值,对数组进行遍历。
①用total+nums[i]和nums[i]进行比较,如果nums[i]较大,则将total置为nums[i],否则total为total+nums[i]。也就是说当
当前的数值 > 其与前面的加和时,直接用当前数值开始计算,会获得最大子串和。
②将total与max进行比较,max取其中最大值。
PS:使用total的原因是,可能存在4,-1,8这样的子串,即时total(=4)+(-1)=3比4小,但还是要继续遍历下去,否则错过了+8的机会。此外,max不能初始化为0,应初始化为数组的首元素。否则[-2,-1]这样的输入返回是错误的。
3.算法
public int maxSubArray(int[] nums) {
if(nums.length==1)
return nums[0];
int total=0;
int max=nums[0];
for(int i=0;i<nums.length;i++){
total=total+nums[i]<nums[i]?nums[i]:total+nums[i];
max=max>total?max:total;
}
return max;
}
4.总结
我在做算法题时首先想到的解决办法都是暴力循环,这样经常会导致超时。应该进行更深入的分析而后再开始编程,算法的正确性和高效性都是重要因素。