【问题标题】:How to find the maximum subarray of size >= 2 for the given array?如何为给定数组找到大小> = 2的最大子数组?
【发布时间】:2016-03-17 16:22:20
【问题描述】:

给定一个数组和一个整数 k,找出 size >=2 的每个连续子数组的最大值。

输入:

int[] array = new int[]{-5,-2,-3,-1,-1};  
int[] array1 = new int[]{5,2,3,-3,1,1};   

输出:

-1,-1   //Since the maximum sum with maximum contiguous subarray can be of size 2 or greater than 2 and all are negative, so we taking the subarray  = -1 -1    
5,2,3  // Because we need to find the maximum sum and  maximum subarray with limitation that array can be >= 2  

我已经解决了这个问题,但是当所有整数都是负数时,我的解决方案不起作用。此外,当输入为 -5、-2、-3、-3、1、1 时,它不起作用。输出应该是 1 和 1,但它是 -3,-3,1 和 1。

我需要一个优化的解决方案。请在下面找到我的代码:

public class Pro {

    static int[] maxSubarray(int[] a) {

        int max_sum = a[0];
        int curr_sum = a[0];

        int max_start_index = 0;
        int startIndex = 0;
        int max_end_index = 1;

        for (int i = 1; i < a.length; i++) {

            if (max_sum > curr_sum + a[i]) {
                startIndex = i-1;
                curr_sum = a[i];
            } else {
                curr_sum += a[i];
            }

            if (curr_sum > max_sum) {
                max_sum = curr_sum;
                max_start_index = startIndex;
                max_end_index = i;
            }
        }

        if (max_start_index <= max_end_index) {
            return Arrays.copyOfRange(a, max_start_index, max_end_index + 1);
        }

        return null;
    }

    public static void main(String[] args) {

        int[] array = new int[]{-5,-2,-3,-1,-1};
        int[] array1 = new int[]{5,2,-3,1,1};
        int[] out = maxSubarray(array1);
        for(int a : out)
        {
            System.out.println(a);
        }

    }

}

还有一个代码 sn-p 可以提供帮助。它找到最大的子数组。见以下代码:

public int maxSubArray(int[] A) {
        int max = A[0];
        int[] sum = new int[A.length];
        sum[0] = A[0];

        for (int i = 1; i < A.length; i++) {
            sum[i] = Math.max(A[i], sum[i - 1] + A[i]);
            max = Math.max(max, sum[i]);
        }

        return max;
    }

【问题讨论】:

  • 我不太明白这个问题,你能解释一下吗?
  • 就像@nickn 所说,请多解释一下这个问题。为什么数组 1 给出 5,2,3 而不是 1,1?您的subbarray &gt;= 2 是您声明中令人困惑的部分。它是否必须至少有 2 个数组条目?我怀疑问题来自curr_sum += a[i];,但我们需要更多说明。就像我说的那样,更多应该发生的事情的例子会有所帮助
  • 添加说明。请检查
  • 打击文盲 - 句子以“.”结尾.

标签: java arrays algorithm data-structures dynamic-programming


【解决方案1】:

您使用的算法称为 Kardane 算法,当所有数字均为负数时无法使用。至少有一个数字必须是正数,算法才能工作。为了使其适用于具有负数但至少有一个正数的数组,每当您在数组中遇到负数时,curr_sum 应设置为 0。实现此目的的一种方法是使用自定义最大函数

private int max(int first, int second) {
     if (first < second) return first;
     else return second;
}

替换:

if (max_sum > curr_sum + a[i]) {
       startIndex = i-1;
       curr_sum = a[i];
       } else {
          curr_sum += a[i];
       }

与:

curr_sum = max(curr_sum + a[i], 0); 
if (curr_sum == 0) startIndex = i + 1; 

完整代码:

   public int max(int[] a) {
    int max_sum = a[0];
    int curr_sum = a[0];
    int startIndex = 0;
    int max_start_index = 0;
    int max_end_index = 1;
    for (int i = 1; i < a.length; i++) {
        max_sum = max(max_sum + a[i], 0);
        if (max_sum == 0) startIndex = i + 1;
        curr_sum = max(curr_sum, max_sum);
        if (curr_sum == max_sum) {
            max_start_index = startIndex;
            max_end_index = i;
        }
    }
    System.out.println("Start index: " + max_start_index);
    System.out.println("End index: " + max_end_index);
    return curr_sum;
}

输入:-5, -2, -3, -3, 1, 1

输出:

Start index: 4 End index: 5 2

【讨论】:

  • 当我给出这个输入 = -5,-2,-3,-3,1,1 ...那么在你的情况下答案是 -5 和 -2 这不是最大值。它应该是 1 和 1
  • 查看我的编辑。每当遇到负数时,startIndex 都需要设置为 i + 1,而不是 i - 1。
  • 我看过你的编辑,当我给这个输入 = -5,-2,-3,-3,1,1 ...那么答案仍然是 -5 和 -2你的情况不是最大的。它应该是 1 和 1 .. 我也对我的问题进行了一些更改并添加了更多解释。看看对你有没有帮助
  • 请在 IDE 中运行您的代码。它仍然没有显示相同输入所需的输出
猜你喜欢
  • 2018-01-03
  • 2019-06-04
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 2022-11-21
  • 2015-09-27
相关资源
最近更新 更多