想法(没看解析之前想不出来)
 
-----------------看了解析和答案
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所指元素);
 
最后遍历数组得到最大值为最大子数组和
 
 
 
 
 
 
posted on 2022-08-01 13:50  Jolyne123  阅读(75)  评论(0)    收藏  举报