找到交替排序的数组

时间:2017-09-01 10:18:47

标签: java arrays algorithm sorting

按照惯例,我在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,但对于中间数字,我被卡住了。 答案必须在内存和时间复杂性方面尽可能高效。

提前致谢。

2 个答案:

答案 0 :(得分:4)

您错误地实施了二进制搜索:ii2指向中间,&#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;序列。您可以使用二进制搜索搜索此序列来找到问题的答案。

您不需要显式创建此数组。为索引0a.length-2编写经典的二进制搜索实现,但不是写s[mid] < xa[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输出=真