java 连续运算_java计算连续子向量的最大和,实现及思路分享

下面给大家带来的内容是计算连续子向量的最大和的java实现以及思路,想要了解的朋友可以一起来看看具体的实例。

题目:

在古老的一维模式识别当中,经常会要计算连续子向量的最大和,在向量全为正数时,问题非常容易就可以解决了,但,假如向量中包含了负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?

例:

{6,-3,-2,7,-15,1,2,2},连续子向量的最大和是8(从第0个开始,到第3个为止)。

给一个数组,返回它的最大连续子序列的和,你是否会被它忽悠?(子向量的长度至少是1)

思路1

代码实现:public class Solution

{

public int FindGreatestSumOfSubArray(int[] array)

{

if (array.length == 0 || array == null)

{

return 0;

}

int curSum = 0;

int greatestSum = 0x80000000;

for (int i = 0; i 

{

if (curSum <= 0)

{

curSum = array[i]; //记录当前最大值

}

else

{

curSum += array[i]; //当array[i]为正数时,加上之前的最大值并更新最大值。

}

if (curSum > greatestSum)

{

greatestSum = curSum;

}

}

return greatestSum;

}

}

思路2:

动态规划

F(i):以array[i]为末尾元素的子数组的和的最大值,子数组的元素的相对位置不变

F(i)=max(F(i-1)+array[i] , array[i])

res:所有子数组的和的最大值

res=max(res,F(i))

如数组[6, -3, -2, 7, -15, 1, 2, 2]

初始状态:

F(0)=6

res=6

i=1:

F(1)=max(F(0)-3,-3)=max(6-3,3)=3

res=max(F(1),res)=max(3,6)=6

i=2:

F(2)=max(F(1)-2,-2)=max(3-2,-2)=1

res=max(F(2),res)=max(1,6)=6

i=3:

F(3)=max(F(2)+7,7)=max(1+7,7)=8

res=max(F(2),res)=max(8,6)=8

i=4:

F(4)=max(F(3)-15,-15)=max(8-15,-15)=-7

res=max(F(4),res)=max(-7,8)=8

按照上面类推

最终res的值为8

代码实现:public int FindGreatestSumOfSubArray(int[] array)

{

int res = array[0]; //记录当前所有子数组的和的最大值

int max = array[0]; //包含array[i]的连续数组最大值

for (int i = 1; i 

{

max = Math.max(max + array[i], array[i]);

res = Math.max(max, res);

}

return res;

}

思路3:

算法时间复杂度O(n)

用total记录累计值,maxSum记录和最大

基础思想:对于一个数A,若是A的左边累计数非负,那么加上A能使得值不小于A,认为累计值对

整体和是有贡献的。

假如,前面几项累计值负数,那么认为有害于总和,total记录当前值。

这个时候,假如和大于maxSum,那么就用maxSum记录下来

代码实现:public class Solution

{

public int FindGreatestSumOfSubArray(int[] array)

{

if (array.length == 0)

return 0;

else

{

int total = array[0], maxSum = array[0];

for (int i = 1; i 

{

if (total >= 0)

total += array[i];

else

total = array[i];

if (total > maxSum)

maxSum = total;

}

return maxSum;

}

}

}

你的思路清晰了吗?你有自己的想法了吗?更多Java实例可以进一步的关注本网了解。

/* * 基于数组的向量实现 */ package dsa; public class Vector_Array implements Vector { private final int N = 1024;//数组的容量 private int n = 0;//向量的实际规模 private Object[] A;//对象数组 //构造函数 public Vector_Array() { A = new Object[N]; n = 0; } //返回向量中元素数目 public int getSize() { return n; } //判断向量是否为空 public boolean isEmpty() { return (0 == n) ? true : false; } //取秩为r的元素 public Object getAtRank(int r)//O(1) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); return A[r]; } //将秩为r的元素替换为obj public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; A[r] = obj; return bak; } //插入obj,作为秩为r的元素;返回该元素 public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r > n) throw new ExceptionBoundaryViolation("意外:秩越界"); if (n >= N) throw new ExceptionBoundaryViolation("意外:数组溢出"); for (int i=n; i>r; i--) A[i] = A[i-1];//后续元素顺次后移 A[r] = obj;//插入 n++;//更新当前规模 return obj; } //删除秩为r的元素 public Object removeAtRank(int r) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; for (int i=r; i<n; i++) A[i] = A[i+1];//后续元素顺次前移 n--;//更新当前规模 return bak; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值