📜  门|门 IT 2007 |第 64 题(1)

📅  最后修改于: 2023-12-03 15:42:21.950000             🧑  作者: Mango

门|门 IT 2007 | 第 64 题

这道题目是一道经典的算法题目,需要用到一些基本的算法知识和编程技巧。

题目描述

有 $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]
练习