【发布时间】: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 >= 2是您声明中令人困惑的部分。它是否必须至少有 2 个数组条目?我怀疑问题来自curr_sum += a[i];,但我们需要更多说明。就像我说的那样,更多应该发生的事情的例子会有所帮助 -
添加说明。请检查
-
打击文盲 - 句子以“.”结尾.
标签: java arrays algorithm data-structures dynamic-programming