连续子数组的最大和
题目
一个整数数组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;
}
方法三:分治
过几天看见了再说
本文来自博客园,作者:荧惑微光,转载请注明原文链接:https://www.cnblogs.com/yinghuoweiguang/p/15770895.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix