📅  最后修改于: 2023-12-03 15:42:21.950000             🧑  作者: Mango
这道题目是一道经典的算法题目,需要用到一些基本的算法知识和编程技巧。
有 $N$ 个互不相同的整数,你需要将其中的两个数挑选出来,使得它们的和为 $M$,并输出这两个整数。
第一行包含一个整数 $N$。 第二行包含 $N$ 个互不相同的整数 $A_1, A_2, ..., A_n$。 第三行包含一个整数 $M$。
输出满足条件的两个整数,如果有多组解,输出任意一组即可。
$1 \le N \le 100000$, $1 \le A_i, M \le 10^9$,
这道题目可以使用哈希表来解决。我们可以先将 $N$ 个数存储到哈希表中,然后遍历这 $N$ 个数, 对于每个数 $A_i$,如果哈希表中存在 $M-A_i$,那么说明这两个数的和为 $M$,直接输出即可。
时间复杂度为 $O(N)$,空间复杂度为 $O(N)$。
def find_numbers(nums, target):
num_hash = {}
for num in nums:
num_hash[num] = True
if target - num in num_hash:
return [target - num, num]
return []
# example usage
nums = [2, 7, 11, 15]
target = 9
result = find_numbers(nums, target)
print(result) # expect [2, 7]
import java.util.*;
public class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> numHash = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
numHash.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
if (numHash.containsKey(target - nums[i]) && numHash.get(target - nums[i]) != i) {
return new int[]{i, numHash.get(target - nums[i])};
}
}
return new int[]{};
}
}
// example usage
int[] nums = new int[]{2, 7, 11, 15};
int target = 9;
Solution solution = new Solution();
int[] result = solution.twoSum(nums, target);
System.out.println(Arrays.toString(result)); // expect [0, 1]