题目描述:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

方法一、暴力解法:

暴力法很简单,遍历每个元素 LeetCode 题解 | 1. 两数之和_i++ ,并查找是否存在一个值与 LeetCode 题解 | 1. 两数之和_暴力法_02 相等的目标元素。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int len=nums.size();

        for(int i=0;i<len-1;i++)
        for(int j=i+1;j<len;j++)
        {
            if(nums[i]+nums[j]==target)
            return {i,j};
        }
        
       return {};
    }
};
方法二: 一遍哈希
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {

        unordered_map<int,int> m;
        
        for(int i=0;i<nums.size();i++)
        {
            if(m.find(target-nums[i])!=m.end())//m中存在对应的键值
                return {m[target-nums[i]],i};//因为i为较大的元素,此时添加进去的键值都还小于i,所以i在后面

            m[nums[i]]=i;  //向map中添加元素
        }
        return {};
    }
};
方法三: 两遍哈希
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {

        unordered_map<int,int> m;

        for(int i=0;i<nums.size();i++)
            m[nums[i]]=i;   //向map中添加元素
        
        for(int i=0;i<nums.size();i++)
        {
            if(m.find(target-nums[i])!=m.end()&&m[target-nums[i]]!=i)//m中存在对应的键值,并且不为i
                return {i,m[target-nums[i]]};
        }
        return {};
    }
};

The desire of his soul is the prophecy of his fate
你灵魂的欲望,是你命运的先知。