连续子数组的最大和

题目

一个整数数组nums,找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
例如:

  • 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
  • 输出:6 // [4,-1,2,1]

方法一:暴力破解

可以考虑暴力破解,为了正向遍历,考虑结尾情况:比如计算以每一个元素结尾的所有子数组里最大的一个子数组,然后找到最大的:

放一个maxSum变量记录每次遍历的最大的
然后就遍历呗,第一个元素结尾的最大情况肯定是是[0],第二个元素结尾的是[0,1] ... 第i个元素结尾的是[i-j,...,i-3,i-2,i-1]...第n个元素结尾的是[n-2,n-1],然后选出最大的

复杂度大约是O(n^2)


方法二:动态规划

前面的方法麻烦在哪里呢,比如计算了第j个位置结尾的最大连续子数组了(假如是j-3, j-2,j-1)
但是在计算j+1位置起手的情况时,还需要再计算一次j-3, j-2,j-1的和(也就是j所计算过的所有位置的情况了,j+1还要再算一次)

这里就涉及到了一个问题
如果计算j+1结尾的最大连续子数组时,j的情况时全部记录好的,则只需要计算

换句话说,知道了j结尾的情况,就一定能知道j+1结尾的情况
这时相当于知道了每一个元素结尾的情况,就知道了整个数组里那一段连续子数组和最大

答案就出来了,

public static int maxSubArray(int[] nums) {
        int preSum=nums[0];//相当于第i-1个位置的情况
        int maxSubSum=nums[0];//保留当前最大和
        int len=nums.length;
        for(int i=1;i<len;i++){//遍历
            preSum=Math.max(nums[i],preSum+nums[i]);//:计算第i个位置的情况
            maxSubSum=Math.max(preSum,maxSubSum);//更细最大和
        }
        return maxSubSum;
    }

方法三:分治

过几天看见了再说

posted @   荧惑微光  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示