想法(没看解析之前想不出来)
-----------------看了解析和答案
1.贪心算法,若当前元素的之前和<0,则丢弃当前元素之前的数列
设一个maxSum作为子序列最大和,一个sum作为当前子序列求和,一个last作为当前元素的之前和;一个now指针遍历数组
now从0开始,每次判断last是否<=0,若小于,则说明加上了也是负增益或无增益,于是丢弃当前元素之前的数列,now+1;若大于则说明是正向增益,将sum更新为nums[now]即当前元素+last;此时判断sum是否大于子序列最大和maxSum,若大于则更新
最后返回maxSum,最后将last更新为sum
最后maxSum中的值为最大子数组和
1 class Solution { 2 public int maxSubArray(int[] nums) { 3 int maxSum = nums[0];int sum = nums[0];int last = 0; 4 //设一个maxSum作为子序列最大和,一个sum作为当前子序列求和,一个last作为当前元素的之前和;一个now指针遍历数组 5 if(nums.length==1){ 6 return nums[0]; 7 } 8 for(int now = 0;now<nums.length;now++){ 9 //now从0开始,每次判断last是否>0,now+1 10 if(last>0){//若大于则说明是正向增益,将sum更新 11 sum = nums[now] + last; 12 }else{//若小于,则说明加上了也是负增益或无增益,于是丢弃当前元素之前的数列 13 sum = nums[now]; 14 } 15 if(sum>maxSum){ 16 //此时判断sum是否大于子序列最大和maxSum,若大于则更新,最后返回maxSum 17 maxSum = sum; 18 } 19 last = sum;//在下一轮中的last为此时的sum 20 } 21 return maxSum; 22 } 23 }
2.动态规划,若前一个元素>0就把他加到当前元素上
设一个last指向前一个元素,now指向当前元素。last=0,now=0;
不断移动last和now,若last>0则把它添加到now所指元素上(更新now所指元素);
最后遍历数组得到最大值为最大子数组和
浙公网安备 33010602011771号