【力扣-哈希表】4、两数之和(1)

129 阅读1分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

1. 两数之和

题目描述

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。   示例 1:

输入: nums = [2,7,11,15], target = 9
输出: [0,1]
解释: 因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

示例 2:

输入: nums = [3,2,4], target = 6
输出: [1,2]

示例 3:

输入: nums = [3,3], target = 6
输出: [0,1]

暴力法

直接两层for循环嵌套(简单易懂)

class Solution {
public:
    vector<int> twoSum(vector<int> &nums, int target)
    {
        vector<int> ret;
        // 使用两层循环嵌套
        for (int i = 0; i < nums.size() - 1; i++)
        {
            for (int j = i + 1; j < nums.size(); j++)
            {
                if (nums[i] + nums[j] == target)
                {
                    ret.push_back(i);
                    ret.push_back(j);
                }
            }
        }
        return ret;
    }
};

执行效率

  • 时间复杂度 O(n^2)
  • 空间复杂度 O(1) 执行结果 image.png

哈希法

题述中,可以按照任意顺序返回答案,考虑三种map的特点: map 键值有序,multimap键值有序,unordered_map键值无序,所以这里可以选择unordered_map来进行操作。

// 使用unordered_map
    // 特点:
    //      底层为哈希表,key值无序 , key值不可更改
    // 查询效率为o(1) ,增删改效率为O(1)
    vector<int> twoSum(vector<int> &nums, int target)
    {
        unordered_map<int, int> map;
        for (int i = 0; i < nums.size(); i++)
        {
            // 确定两数之一为 nums[i]
            // 查找与nums[i]相加等于target的值
            auto iter = map.find(target - nums[i]);
            // 若找到就返回数组
            if (iter != map.end())
            {
                return {iter->second, i};
            }
            // 查询不到就将键值对插入到map中
            // 这里将nums中的数值作为key值,对应的索引作为value值
            // 方便根据key值进行查找
            map.insert(make_pair(nums[i], i));
        }
        return {};
    }

image.png