我试图在一个数组中找到一个连续的子数组,这个子数组的和最大。
{5、15、-30、10、-5、40、10}
使用这些数字连续可能的最大和将是55,或(10 +(-5)+ 40 + 10)= 55。下面的程序输出最大和55,然而,我试图解决的问题是如何打印出产生55的序列。换句话说,我如何打印出10、-5、40和10?
public static void main(String[] args) {
int[] arr = {5, 15, -30, 10, -5, 40, 10};
System.out.println(maxSubsequenceSum(arr));
}
public static int maxSubsequenceSum(int[] X) {
int max = X[0];
int sum = X[0];
for (int i = 1; i < X.length; i++) {
sum = Math.max(X[i], sum + X[i]);
max = Math.max(max, sum);
}
return max;
}
我在考虑创建一个ArrayList来存储i的每个索引处的sum
值,因此ArrayList看起来像(5,20,-10,10,5,45,55).然后我计划清除ArrayList中从索引0到列表中第一个负数的内容,然而,这只解决了这个特定示例的问题,但是如果我改变了原始的数组,这个解决方案就不起作用了。
8条答案
按热度按时间kgsdhlau1#
你可以用if语句替换Math.Max函数,并更新最佳子数组的起始和结束索引。Pascal版本:
sd2nnvve2#
你可以跟踪循环中当前最佳子数组的开始和结束索引。不用
max()
来计算sum
和max
,只需执行以下操作:0dxa2lsx3#
有一个O(n)的解决方案,一个遍历数组的for循环,每当当前的总数小于0时,就重置子序列。
{5、15、-30、10、-5、40、10}
编辑:获取子序列...每当你改变最大值时,更新你的子序列
6rqinv9w4#
它可以通过捕获开始和结束,同时识别最大子阵列来完成,如下所示:
代码
输出
可从https://github.com/gosaliajigar/Programs/blob/master/src/recursion/MaximumSubArray.java下载解决方案
lnvxswe25#
两个子阵列是
[一、二、三]
和[4,9],不包括负数
这里的最大子数组是[ 4,5]
因此输出为9
下面是代码
qco9c6ql6#
bprjcwpo7#
l2osamch8#
你需要对所有可能的子数组求和。2要做到这一点,你可以这样做: