Java 如何找到大小的最大子阵列>;=2对于给定的数组?
给定一个数组和一个整数k,找出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,
大小>=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中运行您的代码。它仍然没有显示相同输入的所需输出