[英]Maximum Subsequence Sum in Java
我有一个整数数组,我想找到最大子序列和(MSS)。 我正在尝试递归解决此问题-使用分而治之。
想法是将数组拆分为一半,对两半进行递归,然后找到数组左右两半的最大和,然后将它们与从递归中获得的值进行比较。
我知道还有其他方法可以解决问题。 但是,在查看其他解决方案之前,我想弄清楚代码中的错误。 现在,根据我的输入,我将MSS设置为12,此时应该为8(2、5,-5、5、1)
import java.lang.Math;
public class Solution {
public static void main(String[] args){
int[] arr = new int[7];
arr[0] = 1;
arr[1] = -3;
arr[2] = 2;
arr[3] = 5;
arr[4] = -5;
arr[5] = 5;
arr[6] = 1;
System.out.println(helper(arr, 0, arr.length - 1));
}
public static int helper(int[] arr, int low, int high) {
if (low >= high) {
return Math.max(arr[low], 0);
}
int mid = low + (high - low) / 2;
int L = helper(arr, low, mid);
int R = helper(arr, mid + 1, high);
int sum = 0;
int leftSum = 0;
for (int i = mid - 1; i >= 0; i--) {
sum = sum + arr[i];
leftSum = Math.max(leftSum, sum);
}
sum = 0;
int rightSum = 0;
for (int i = high; i >= mid; i--) {
sum = sum + arr[i];
rightSum = Math.max(rightSum, sum);
}
return Math.max(L, Math.max(R, leftSum + rightSum));
}
}
我到底哪里出问题了?
编辑:我正在尝试找到最大连续和
O(2*n)
,目前是错误的! 可以使用O(n)
完成此解决方案,如下所示:
import java.lang.Math;
public class Solution {
public static void main(String[] args){
int[] arr = {1, -3, 2, 5, -5, 5, 1};
System.out.println(maximumSubsequenceSum(arr));
}
public static int maximumSubsequenceSum(int[] arr) {
int maxSoFar = 0;
int maxEndingHere = 0;
for(int item : arr) {
maxEndingHere = Math.max(maxEndingHere + item, 0);
maxSoFar = Math.max(maxSoFar, maxEndingHere);
}
return maxSoFar;
}
}
此解决方案完全基于本文描述的算法: 使用BSP / CGM模型和多GPU CUDA解决最大子序列和及相关问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.