
想法(没看解析之前想不出来)
-----------------看了解析和答案
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所指元素);
最后遍历数组得到最大值为最大子数组和
分类:
Leecode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix