【LeetCode Hot 100】1. 两数之和

题目描述

显然,最简单和直接的想法是使用暴力枚举:使用双重循环枚举符合条件的下标对并返回。这种方法的时间复杂度是平方级别\(O(N^2)\)

对于每个确定的数x,我们需要找到target - x对应的下标,暴力枚举方法使用的是直接遍历,这个操作的复杂度是线性的,而如果我们使用哈希表将元素及其下标进行对应,再进行查找时时间复杂度就变成了常熟级别。而且,元素自己不能和自己匹配,使用哈希表先查找是否包含此键值,也可以保证不会发生这种情形。

于是,思路就是,我们从前往后遍历数组下标i,每处理一个x = nums[i],首先查询target - x是否存在哈希表中,如果存在则说明我们找到了答案,可以返回结果,如果不存在,我们就需要将此键值对{nums[i], i}插入哈希表中,继续处理下一个元素。

// C++
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> m;
        vector<int> res(2);
        for (size_t i = 0; i < nums.size(); ++i) {
            if (m.find(target - nums[i]) != m.end()) {
                res[0] = m.at(target - nums[i]);
                res[1] = i;
            }
            m.insert({nums[i], i});
        }
        return res;
    }
};

// Java
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; ++i) {
            if (map.containsKey(target - nums[i])) {
                return new int[] {i, map.get(target - nums[i])};
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("");
    }
}
posted @ 2024-09-13 15:34  随机生成一个id  阅读(20)  评论(0)    收藏  举报