按照惯例,我在Google周围搜索并在这里寻找答案,但无法找到任何可以帮助我的内容。请记住它的 NOT 作业,我正在学习考试并努力完成这个问题的答案。 这是一个交替排序的数组,意思是,偶数索引元素被排序,奇数索引元素也被排序(从最小到最大的数字)。 例如:
int a[] = {1,2,5,3,6,10,9};
现在,问题是要求编写一个布尔方法,它接收一个数组和一个数字x,如果数字是2个相邻" tile"的可能组合,则返回true。如果没有,则为假。例如:
x = 9;
FindX(a,9) -> true;
a[3](3) + a[4](6) = 9.
我已经编写了我的方法,似乎使用了一个 IS 可能的组合数字,但当它应该返回false时,当数字在范围内时它会被卡住2种可能的组合。
public static boolean FindX(int a[], int x){
if (a.length==1) { // The question specifies if it's an array with 1 element is should return false.
return false;
}
int i=(a.length-1)/2; // The middle index
int i2=i+1; // The adjacent index
for (; i>=0 && i2<a.length;){ // beginning of loop, if either index is out of bounds, terminates look
if (a[i]+a[i2]==x) { // once you reach the proper index (when x is within) it returns true
return true;
}
else if (a[i]+a[i2]>x){ // if x is smaller than current combo, make the new index in the new bounds
i = (i/2)+1;
i2 = i+1;
}
else if (a[i]+a[i2]<x){ // same as above boolean, but opposite situation
i = (i2+a.length)/2;
i2 = i+1;
}
}
return false;
}
每当我输入一个可能的组合时,它确实有效。但是,如果我举了14,其中我介于9(= a [3] (3) + a [4] (6))和16(= a [ 4] (6) + a [5] (10))它永远循环,当发生这种情况时我无法想出退出的正确方法。如果数字超出可能的组合但不在范围内,则确实返回false,但对于中间数字,我被卡住了。 答案必须在内存和时间复杂性方面尽可能高效。
提前致谢。
答案 0 :(得分:4)
您错误地实施了二进制搜索:i
和i2
指向中间,&#34;中间加一,&#34;你应该保持一个索引指向有效范围的开头和一个到最后。
为了正确实现这一点,首先考虑一个由相邻项的总和组成的虚数阵列:
int a[] = {1,2,5,3,6,10,9};
int s[] = { 3,7,8,9,16,19};
这个虚构的数组会有a.length-1
个元素,它会按升序排序。
这个观察结果取代了两个交替排序的&#34;不方便&#34;具有单个完全排序的序列&#34;方便&#34;序列。您可以使用二进制搜索搜索此序列来找到问题的答案。
您不需要显式创建此数组。为索引0
到a.length-2
编写经典的二进制搜索实现,但不是写s[mid] < x
写a[mid]+a[mid+1] < x
。
答案 1 :(得分:1)
根据dasblinkenlight建议,简单的二进制搜索实现可以满足此要求。效率很高
public class combo {
public static void main(String[] args){
int a[] = {1,2,5,3,6,10,9};
System.out.println(FindX(a, 14));
}
public static boolean FindX(int a[], int x){
if (a.length==1) { // The question specifies if it's an array with 1 element is should return false.
return false;
}
int mid = a.length/2;
int toSearchFrom = 0;
int toSearchTill = 0;
if(a[mid-1]+a[mid] < x){
toSearchFrom = mid;
toSearchTill = a.length - 1;
} else if(a[mid-1]+a[mid] > x){
toSearchFrom = 0;
toSearchTill = mid - 1;
}
for(int i=toSearchFrom; i < toSearchTill; i++){
if(a[i] + a[i+1] == x){
return true;
}
}
return false;
}
}
示例输入1 - 19输出=真
样本输入2 - 14输出=假
示例输入3 - 3输出=真