![](/img/trans.png)
[英]Find all pairs of elements from an array whose sum is equal to given number by hashmap in java
[英]How to Find all Pairs in an Array of Integers Whose sum is Equal to a Given Number
正在对公司进行选择,但显然我辜负了他。 但是一个我无法解决的单独任务困扰着我。 我想了解我错在哪里以及问题出在哪里。
问题的条件给定一个肯定的 integer“目标”。 还给出了一个正整数序列。 如果序列有两个数,则必须在output文件中写“1”,两个数之和等于“target”的值,如果没有则为“0”。
输入格式
5
1 7 3 4 7 9
Output 格式
1
笔记
问题中使用的所有数字都在 0 < N < 999999999 范围内
输入文件名:input.txt
Output 文件名:output.txt
时间限制 1.5 秒
Memory 限制64MB
我的代码
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
public class Sum {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(new File("input.txt"));
List<Integer> allNumbers = new ArrayList<Integer>();
while(scanner.hasNext()) {
allNumbers.add(scanner.nextInt());
}
int target = allNumbers.get(0);
allNumbers.remove(0);
Integer [] myArray = allNumbers.toArray(new Integer[0]);
printpairs(myArray, target);
}
static void printpairs(Integer arr[], int target) throws IOException {
HashSet<Integer> s = new HashSet<Integer>();
FileOutputStream fos = new FileOutputStream("output.txt");
int temp = 0;
final int index = arr.length;
for (int i = 0; i < index; ++i) {
temp = target - arr[i];
if (s.contains(temp)) {
fos.write(Integer.toString(1).getBytes());
break;
}
s.add(arr[i]);
}
if (!s.contains(temp)) {
fos.write(Integer.toString(0).getBytes());
}
}
}
If I use Java 7x32 I go beyond the time limit, and if I use Java 8 I go beyond the memory limit I also tried to solve through HashSet, but the problem remained the same.
另一个我的变种
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Sum {
public static void main(String[] args){
List<Integer> allNumbers = new ArrayList<>();
try {
Scanner scanner = new Scanner(new File("input.txt"));
while (scanner.hasNext()) {
allNumbers.add(scanner.nextInt());
}
scanner.close();
} catch(FileNotFoundException e) {
}
int target = allNumbers.get(0);
allNumbers.remove(0);
Integer[] array = allNumbers.toArray(new Integer[0]);
try {
printpairs(array, target);
} catch (Exception e) {
}
}
public static void printpairs(Integer[] numbers, int target) throws Exception {
FileOutputStream fos = new FileOutputStream("output.txt");
Arrays.sort(numbers);
int left = 0;
int right = numbers.length - 1;
int sum = 0;
while (left < right) {
sum = numbers[left] + numbers[right];
if (sum == target) {
fos.write(Integer.toString(1).getBytes());
fos.close();
break;
} else if (sum < target) {
left = left + 1;
} else if (sum > target) {
right = right - 1;
}
}
if (sum != target) {
fos.write(Integer.toString(0).getBytes());
fos.close();
}
}
}
这是简化此类问题的已知方法:
Set<Integer> sumtoTarget = new HashSet<>();
for (int i = 0; i < n; i++) {
Integer number = arr[i];
if (number > target) { continue; }
Integer diff = target - number;
if (diff > 0) {
if (sumToTarget.contains(diff) {
// found your pair diff + number
return 1;
} else { // add to the set
sumToTarget.add(diff);
}
}
}
return 0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.