[Leetcode] #01-Two Sum

Posted zhouleyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Leetcode] #01-Two Sum相关的知识,希望对你有一定的参考价值。

抱着试一试的心态打开了著名的Leetcode去做了第一题,结果连续两次提交都失败了,其间还有3次编译错误= =。

看了一下导致解答错误的输入。

第一次错误,虽然很正确地想到了使用hashmap,但没有考虑相同的输入,因为[3,3,2] 6对应的输出可以是[0,1],而不是[],而这个错误输出是由于hashmap的特性导致的。

不服再来,于是就有了第二次错误...这次我使用了双数组+hashmap,对于重复出现的整数,我给它标记两个下标,反正答案只有一对整数,这样处理完全没有问题。但是,我把自身考虑了两次,比如说,对于输入[3,2,4],我的程序输出的是[0,0]。

好的,有了两次失败的经验,第三次通过了。看一看结果:用时20ms--击败了68.46%的用户,还不错? 占用内存10.5MB--击败了12.42%的用户——我。。。

那一瞬间我感觉自己真是菜得无地自容。。。。。

以下是我的代码:

vector<int> twoSum(const vector<int>& nums, int target)

    std::array<int, 2> mark =  -1,-1 ;
    std::vector<int> result;
    std::map<int, std::array<int, 2>> ref;
    int buffer = 0;
    std::map<int, std::array<int, 2>>::iterator iter;

    for (std::size_t i = 0; i < nums.size(); i++)
    
        if (ref.find(nums[i]) == ref.end())
        
            ref[nums[i]] = mark;
            ref[nums[i]][0] = i;
        
        else
            ref[nums[i]][1] = i;
    
    for (std::size_t j = 0; j < nums.size(); j++)
    
        buffer = target - nums[j];
        iter = ref.find(buffer);
        if (iter != ref.end())
        
            if (iter->first == nums[j])
            
                if (iter->second[0] != j)
                
                    result.push_back(iter->second[0]);
                    result.push_back(iter->second[1]);
                    return result;
                
            
            else
            
                result.push_back(j);
                result.push_back(iter->second[0]);
                return result;
            
        
    
    return result;

分割线—————————————————————————————————————————————

研究了一下和我用时相同的代码:

vector<int> twoSum(vector<int>& nums, int target) 
        vector<int> result;
        map<int,int> hash_map;
        for(size_t i=0;i<nums.size();++i)
        
            hash_map[nums[i]]=i;
        
        for(size_t j=0;j<nums.size();++j)
        
            if(hash_map.count(target-nums[j])!=0&&j!=hash_map[target-nums[j]])
            
                result.push_back(j);
                result.push_back(hash_map[target-nums[j]]);
                break;
                       
        
        return result;
    

人家根本不用检查自身是否重复!totally make sense!本来就不用检查,因为第一个for循环中添加元素时重复元素的下标会覆盖之前的,而第二个for循环中恰好可以考虑到之前的下标。

 

再研究一下用时0ms的代码:

vector<int> twoSum(vector<int>& nums, int target) 
        vector<int> result;
        if(nums.size() == 0)
            return result;
        unordered_map<int, int> table;
        for(int i=0; i<nums.size(); i++)
            if(table.find(target - nums[i]) != table.end())
                result.push_back(table[target - nums[i]]);
                result.push_back(i);
                break;
            
            else
                table.insert(pair<int, int> (nums[i], i));
        
        return result;
    

非常巧妙,使用了unordered_map减少了一个for循环。

但是,我连unordered_map在标准库里都不知道,更别谈用它了。所以,先把标准库中重要的部分多了解了解。

完毕。

以上是关于[Leetcode] #01-Two Sum的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来编写这个 SparkSQL 语句?

LeetCode 解题目录汇总

leetcode 352 & leetcode 239 & leetcode 295 & leetcode 53 & leetcode 209

如何做LeetCode

leetcode可以写在简历上吗

[Leetcode]leetcode1-10题随记