给定一个数组a,求最大子序和:
设一个变量sum,用它来储存子序和,比较暴力的办法是求出当前数组所有可能的子序的和再从中找到最大值。
设置一个变量sum,给sum一个初始值0;设一个变量ans,初始值a[0];用它来返回最大值;如果a只有一个数字,那么当前的sum就是最大子序和;但是如果a不止只有一个数字呢,怎样确定sum最大值呢?
数组中的数字可能是负数,0,正数。假如我们这样:sum从a[0]开始加,遇到正数或0时sum=sum+a[i];遇到负数时,当前的sum就该停止了,此时的ans=max(ans,sum)sum从停止位置的下一位置开始(指下一个遇到的正数或0)重新加起,直到遇到下一负数ans =max(ans,sum);以此类推,我们就会得到最大子序和。 但是这种方法并不能满足数组中全是负数的情况。
!!! 以下是正解 !!!
现在我们这样想:我们不去想sum+a[i]求最大值,我们去想a[i]+sum 求最大值,那么问题的关键就变成了sum的正负。**如果sum>0,那么sum=sum+a[i],如果sum<0,sum=a[i];ans=max(ans,sum);**这样即使数组全是负数也可以求出答案。
class Solution17 { 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;} }