posts - 21,comments - 0,views - 16835

 

 

想法(没看解析之前想不出来)
 
-----------------看了解析和答案
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   Jolyne123  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示