Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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 查找数组中两个最大的非相邻整数之和_Java - Fatal编程技术网

Java 查找数组中两个最大的非相邻整数之和

Java 查找数组中两个最大的非相邻整数之和,java,Java,我在某个网站上找到了这个面试问题,并思考了它的解决方案 我找到的最佳解决方案是迭代整个数组,同时保存4个最大的数字及其索引 之后,我需要找到这些数字中最大的一对,以确保所选数字不相邻 我认为这确保了问题的正确解决,但我不确定这是否是最好的解决方案 下面是我的简单代码。 有人能给我一个更好的主意吗 public int findMaxNonAdjacent(int [] array){ int big1=0, big2=0,big3=0,big4=0; int i1=0,i2=0,

我在某个网站上找到了这个面试问题,并思考了它的解决方案

我找到的最佳解决方案是迭代整个数组,同时保存4个最大的数字及其索引

之后,我需要找到这些数字中最大的一对,以确保所选数字不相邻

我认为这确保了问题的正确解决,但我不确定这是否是最好的解决方案

下面是我的简单代码。
有人能给我一个更好的主意吗

public int findMaxNonAdjacent(int [] array){
    int big1=0, big2=0,big3=0,big4=0;
    int i1=0,i2=0,i3=0,i4=0;
    for(int i=0;i<array.length;i++)
    {
        if(array[i]>=big1){
            big4=big3;
            big3=big2;
            big2=big1;
            big1=array[i];
            i4=i3;
            i3=i2;
            i2=i1;
            i1=i;
        }else if(array[i]>=big2){
            big4=big3;
            big3=big2;
            big2=array[i];
            i4=i3;
            i3=i2;
            i2=i;
        }else if(array[i]>=big3){
            big4=big3;
            big3=array[i];
            i4=i3;
            i3=i;
        }else if(array[i]>=big3){
            big4=array[i];
            i4=i;
        }
    }
    if(Math.abs(i1-i2)>1)
        return big1+big2;
    else if(Math.abs(i1-i3)>1){
        return big1+big3;
    }else if((big1+big4>=big2+big3) &&(Math.abs(i1-i4)>1)){
        return big1+big4;
    }else if((big1+big4<=big2+big3) &&(Math.abs(i2-i3)>1)){
        return big2+big3;
    } else
        return big3+big4;
}
public int findMaxNonAdjacent(int[]数组){
int big1=0,big2=0,big3=0,big4=0;
inti1=0,i2=0,i3=0,i4=0;
for(int i=0;i=big1){
big4=big3;
big3=big2;
big2=big1;
big1=数组[i];
i4=i3;
i3=i2;
i2=i1;
i1=i;
}else if(数组[i]>=big2){
big4=big3;
big3=big2;
big2=数组[i];
i4=i3;
i3=i2;
i2=i;
}else if(数组[i]>=big3){
big4=big3;
big3=数组[i];
i4=i3;
i3=i;
}else if(数组[i]>=big3){
big4=数组[i];
i4=i;
}
}
如果(数学abs(i1-i2)>1)
返回big1+big2;
否则如果(数学abs(i1-i3)>1){
返回big1+big3;
}else如果((big1+big4>=big2+big3)和(Math.abs(i1-i4)>1)){
返回big1+big4;
}else if((big1+big41)){
返回big2+big3;
}否则
返回big3+big4;
}

使用基于1的索引;查找数组中最大元素的索引。如果它是
1
,则查找范围
[3,n]
中的最大值并返回其总和。如果最大值位于索引
n
,则在范围
[1,n-2]
中查找最大值并返回其总和。否则,如果最大的索引是
i
,则在
[1,i-2]
中查找最大的索引,并在
[i+2,n]
中查找最大的索引。让它们分别为
l
r
。然后答案将是
max(A[i-1]+A[i+1],A[i]+max(A[l],A[r])

为什么要在代码中保留4个索引?在我看来,根据鸽子洞原理,只有3个元素是足够的。另一件事是检查输入数组是否少于3个元素,因为它是无效的输入。

如果
array
只包含负数,会发生什么?您可能还需要检查哪些其他情况?我可以将容器初始化为最小的int值,我考虑过这一点。但目前我不认为有任何角落案例我没有涉及。所以基本上你需要在一个数组中找到两个大数字,并确保它们不相邻?@Eliyahu:如果输入数组只包含2个值怎么办?还是0?@Eliyahu:如果你计划面试问题,那么这些就是你应该明确的假设。或者更好:建议检查它们。即使面试官说“是的,但你不需要检查他们”,我相信他们会注意到你已经考虑过了。在面试中,错误或拐弯的情况通常至少和你最终使用的实际算法一样有趣。我不确定你的解决方案是否比我的好。事实上,他的解决方案已经是O(N)时间复杂度了。要真正改进它,您必须提供O(logN)时间复杂度解决方案。而且空间复杂度已经是恒定的,即O(1)。@SuryakantBharti要应用一些
O(logN)
解决方案,需要对输入进行一些排序。由于输入是随机的,为了对其进行排序,需要花费
O(NlogN)
时间,因此解决方案的下限是
O(N)
@Eliyahu您的解决方案需要
4n
比较,而我的解决方案需要
2n
比较。我不反对原则,但您将如何处理以下示例:[1,2,3,2,4,3,5,6,5,5,4,2,3]有3个索引?哦!我认为这些数字是唯一的。然后,继续你的方法。