Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找到大小的最大子阵列>;=2对于给定的数组?_Java_Arrays_Algorithm_Data Structures_Dynamic Programming - Fatal编程技术网

Java 如何找到大小的最大子阵列>;=2对于给定的数组?

Java 如何找到大小的最大子阵列>;=2对于给定的数组?,java,arrays,algorithm,data-structures,dynamic-programming,Java,Arrays,Algorithm,Data Structures,Dynamic Programming,给定一个数组和一个整数k,找出大小>=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,

给定一个数组和一个整数k,找出
大小>=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);
        }

    }

}
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;
    }
public class-Pro{
静态int[]最大子数组(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[i]){
startIndex=i-1;
curr_sum=a[i];
}否则{
curr_sum+=a[i];
}
如果(当前金额>最大金额){
最大金额=当前金额;
最大起始索引=起始索引;
max_end_index=i;
}
}

如果(max_start_index您使用的算法称为卡丹算法,当所有数字都为负数时不能使用。算法必须至少有一个数字为正数才能工作。若要使其适用于包含负数但也包含至少一个正数的数组,则无论何时,都应将
curr_sum
设置为0数组中有一个负数。实现这一点的一种方法是使用自定义的max函数

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

完整代码:

   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;
}
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
输入:
-5、-2、-3、-3、1、1

输出:

开始索引:4
结束索引:5

2

您使用的算法称为卡丹算法,当所有数字都为负数时不能使用。算法必须至少有一个数字为正数才能工作。若要使其适用于包含负数和至少一个正数的数组,每当遇到n时,
curr\u sum
应设置为0数组中的负数。实现这一点的一种方法是使用自定义max函数

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

完整代码:

   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;
}
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
输入:
-5、-2、-3、-3、1、1

输出:

开始索引:4
结束索引:5

2

我不太明白这个问题,你能再解释一下吗。就像@nickn说的,请再解释一下这个问题。为什么数组1给出的是5,2,3,而不是1,1?你的
子数组>=2
是你语句中令人困惑的部分。它必须至少有两个数组条目吗?我怀疑问题来自这里
curr_sum+=a[i];
但是我们需要更多的澄清。就像我说的,更多的例子会有助于增加解释。请检查扫盲-句子以“.”结尾。我不太明白这个问题,你能再解释一下吗。就像@nickn说的,请再解释一下这个问题。为什么数组1给出5,2,3而不是1,1呢?你的
子数组>=2
是你语句中令人困惑的部分。它必须至少有2个数组条目吗?我怀疑问题来自这里
curr_sum+=a[i];
但我们需要更多的澄清。如我所说,更多的例子将有助于增加解释。请勾选-句子以“.”结尾.当我给出这个输入=-5,-2,-3,-3,1,1…那么在你的情况下答案是-5和-2,这不是最大值。它应该是1和1请参见我的编辑。每当遇到负数时,startIndex需要设置为i+1,而不是i-1。我已经看到你的编辑,当我给出这个输入=-5,-2,-3,1,1…那么答案仍然是-5和-2你的情况不是最大值。它应该是1和1。我在我的问题中也做了一些更改,并添加了更多的解释。看,如果它对你有帮助,请在IDE中运行你的代码。它仍然没有显示相同输入的所需输出。当我给出这个输入=-5,-2,-3,-3,1,1…那么在你的情况下答案是-5和-2,这不是最大值imum.它应该是1和1参见我的编辑。每当遇到负数时,startIndex需要设置为i+1,而不是i-1。我已经看到了你的编辑,当我给出这个输入=-5,-2,-3,-3,1,1…那么在你的情况下答案仍然是-5和-2,这不是最大值。它应该是1和1。我也在我的问题中做了一些更改并添加了更多解释。请看,如果它对您有帮助,请在IDE中运行您的代码。它仍然没有显示相同输入的所需输出