代码随想录|哈希表|05两数之和

leetcode:1. 两数之和 - 力扣(LeetCode)

题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

思路

暴力枚举,两层for循环,因为题目要求同一个元素不可以重复使用,所以j一定是从i的后面一个开始枚举的。

// -----------------------暴力解法-------------------------
// 被注释掉的是另外的写法。
class Solution
{
public:
    vector twoSum(vector &nums, int target)
    {
        vector res;
        for (int i = 0; i < nums.size() - 1; i++)
        {
            for (int j = i + 1; j < nums.size(); j++)
            {
                if (nums[i] + nums[j] == target)
                {
                    // res.push_back(i);
                    // res.push_back(j);
                    return {i, j};
                }
            }
        }
        // return res;
        return {};
    }
};

为了降低上面的时间复杂度O(n^2),我们采用哈希表map,当遍历nums的元素是,我们就从map里面查找有没有配套的键元素,找到键key,就有了值value,所以这里的map的key是nums里面的值,value是nums里面的索引下标。

// -----------------------哈希表(map)-------------------------
class Solution
{
public:
    // 函数twoSum用于在数组nums中找到两个数,使它们的和等于target
    vector twoSum(vector &nums, int target)
    {
        // 使用unordered_map来存储数组中的元素及其索引
        unordered_map map;
        // 遍历数组nums
        for (int i = 0; i < nums.size(); i++)
        {
            // 在map中查找是否存在一个数,使得该数与当前数之和等于target
            auto iter = map.find(target - nums[i]);
            // 如果找到了这样的数
            if (iter != map.end())
            {
                // 返回这两个数的索引
                return {iter->second, i};
            }
            // 如果没有匹配对象,则将当前匹配对加入map
            map.insert(pair(nums[i], i));
            // 下面这种表示方式更简洁
            // map[nums[i]]=i;
        }
        return {};
    }
};

总结

在使用map的时候,我们只能用find找到的是有效的迭代器iter,iter->first iter->second分别取的是key和value,find()括号里面是key,所以我们不可以通过value去查找迭代器。

参考资料

代码随想录

梦开始的地方,Leetcode:1.两数之和,学透哈希表,map使用有技巧!_哔哩哔哩_bilibili 

你可能感兴趣的:(散列表,leetcode,算法,数据结构,c++,哈希算法)