连续子数组的最大和
题目
一个整数数组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

浙公网安备 33010602011771号