我目前正在尝试解决算法问题,由于是编程新手,所以我觉得如果没有一些知识就无法弄清楚。我的目的不是要得到问题的答案,而是要提出使用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();
}