力扣热题100道之最大子数之和
解法
动态规划
遍历数组,当前若干位的和小于当前位的数的时候,丢弃前面的和。因为你都比我小了,我用你为什么不直接用我当前的这个呢。当最大值比新加入了当前位的数后的前若干位的和小的时候,最大值变为加入了最新的数据后的前若干位的和
class Solution {public int maxSubArray(int[] nums) {int n=nums.length;int sum=0;int maxsum=nums[0];for(int num:nums){if(sum+num>num){sum=sum+num;}else{sum=num;}if(sum>maxsum){maxsum=sum;}}return maxsum;}
}
贪心算法
之前和小于0,就丢弃
class Solution {public int maxSubArray(int[] nums) {int n=nums.length;int max=nums[0];int sum=0;for(int num:nums){if(sum<0){sum=num;}else{sum+=num;}if(sum>max){max=sum;}}return max;}
}
历史解法
报错超出时间限制的解法
我的算法是定义一个遍历指针i,i的元素大于0的时候,开始往后,如果到他后面的若干位的和仍然大于零,接着往下走,并且记录其中的最大值,如果出现从i往后若干位的和小于零的情况,开始从i++。走到超出时间限制这个程度,说明我的算法跑通了。只是他本身不太行。
看了官方题解之后,我发现,我的算法是不完善的贪心算法,我的算法,如果用贪心算法一定不会报这个错误的。
class Solution {public int maxSubArray(int[] nums) {int n=nums.length;int smax=nums[0];for(int i=0;i<n;i++){if(nums[i]<=0){if(nums[i]>smax){smax=nums[i];}}else{int j=i;int tsum=nums[j];int tmsum=nums[j];j++;while(j<n&&tsum>0||i==j-1&&j==n){if(j==n){tsum=nums[j-1];}else{tsum=tsum+nums[j];}if(tmsum<=tsum){tmsum=tsum;}j++;if(smax<tmsum){smax=tmsum;}}}}return smax;}
}