[哈希表]leetcode1:两数之和(easy)

题目:
[哈希表]leetcode1:两数之和(easy)_第1张图片
题目链接:https://leetcode-cn.com/problems/two-sum/
这里提供三种解法,代码如下(注解已给出):

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        /*题解1:暴力法
        **遍历数组的每一个元素x,并查找是否存在一个值与 target−x相等的目标元素
        */
        for(int i=0;i<nums.size();++i)
            for(int j=i+1;j<nums.size();++j)
            {
                if(nums[i]==target-nums[j])
                    return {i,j};
            }
        return {};
        
        
        /*题解2:一遍哈希表
        **改进:在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。
        **如果它存在,那我们已经找到了对应解,并立即将其返回。
        */
        map<int,int> a;//提供一对一的hash
        vector<int> b(2,-1);//用来承载结果,初始化一个大小为2,值为-1的容器b
        for(int i=0;i<nums.size();i++)
        {
            if(a.count(target-nums[i])>0)
            {
                b[0]=a[target-nums[i]];
                b[1]=i;
                break;
            }
            a[nums[i]]=i;//反过来放入map中,用来获取结果下标
        }
        return b;
        
        
        /*题解3:两遍哈希表
        **该方法用map实现,map是STL的一个关联容器
        **它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力
        */
        map<int,int> a;//建立hash表存放数组元素
        vector<int> b(2,-1);//用来承载结果,初始化一个大小为2,值为-1的容器b
        for(int i=0;i<nums.size();i++)//将数组元素插入哈希表中
            a.insert(map<int,int>::value_type(nums[i],i));
        for(int i=0;i<nums.size();i++)
        {
            if(a.count(target-nums[i])>0&&(a[target-nums[i]]!=i))
            //判断是否找到目标元素且目标元素不能是本身
            {
                b[0]=i;
                b[1]=a[target-nums[i]];
                break;
            }
        }
        return b;
    }
};

你可能感兴趣的:(leetcode刷题,算法,刷题)