在巨大的数组中找到两个特定的数字

时间:2018-12-21 12:12:43

标签: java-7

我目前正在尝试解决算法问题,由于是编程新手,所以我觉得如果没有一些知识就无法弄清楚。我的目的不是要得到问题的答案,而是要提出使用Java处理巨大数组的建议。

问题是:您收到一个数字(3> n <200.000),然后收到一个具有n个长度的数字排序数组,然后又收到另一个数字(n2)(所有数字都可以由一个整数保留)

您必须在数组中找到两个数字,它们的和将成为n2-n。

您将始终有正确的答案,并且始终是两个数字。

每个例子: 3 1 2 3 3 答案是1和2,因为6-3 = 3;

我的代码可以工作,但是它超过了时间和内存消耗。因此,我正在寻找可以说出更好的方法来找到这些数字的人,而不是可以用来改进我的算法实践的更好的方法。

到目前为止,我所做的就是将数组中的所有数字求和,得到n2-n;然后创建两个索引,第一个0和第二个(n2-n)-1;然后在第一个索引小于第二个索引时循环通过。在循环期间,对第一索引和第二索引执行二进制搜索。如果二进制搜索找到两个数字,则将它们作为答案返回。

public static BufferedReader br;
public static int numHechizos;
public static String line;
public static String[] split;
public static int damage;
public static int[] hechizos;

public static void main(String[] args) throws IOException {
    br = new BufferedReader(new InputStreamReader(System.in));

    numHechizos = Integer.parseInt(br.readLine());

    while (numHechizos != 0){
        caso(numHechizos);
        numHechizos = Integer.parseInt(br.readLine());
    }
}

public static void caso(int numHechizos) throws IOException {
    line = br.readLine();
    split = line.split(" ");
    damage = Integer.parseInt(br.readLine());

    int sum = 0;
    hechizos = new int[numHechizos];
    for (int i = 0; i < numHechizos; i++) {
        int num = Integer.parseInt(split[i]);
        hechizos[i] = num;
        sum += num;
    }

    int find = sum - damage;
    int n1 = 1; int n2 = find - 1;
    while (n1 < n2){
        int bn1 = Arrays.binarySearch(hechizos, n1);
        int bn2 = Arrays.binarySearch(hechizos, n2);

        if (bn1 > -1 && bn2 > -1){
            System.out.println(n1 + " " + n2);
            break;
        }
        n1++;
        n2--;
    }

    System.gc();
}

0 个答案:

没有答案