【问题标题】:Maximum Subsequence Sum in JavaJava中的最大子序列和
【发布时间】:2018-04-03 00:11:55
【问题描述】:

我有一个整数数组,我想找到最大子序列和 (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));
  }
}

我到底哪里错了?

编辑:我正在尝试找到最大的连续总和

【问题讨论】:

标签: java algorithm


【解决方案1】:
  • 首先,我在您的程序中没有看到 recursion 的任何用法!
  • 其次,你的解决方案是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;
    }
}

此方案纯粹基于本文描述的算法:Solving the maximum subsequence sum and related problems using BSP/CGM model and multi-GPU CUDA

【讨论】:

  • 是的,我知道有一个 O(n) 解决方案,并且我知道该算法。然而,这不是我想要的。
  • O(2n) = O(n)。一次性解决方案不一定比mulipass 更好。不过,这只是一个挑剔。 +1 解决所有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多