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