美文网首页
LeetCode从零刷起 (1. Two Sum)

LeetCode从零刷起 (1. Two Sum)

作者: CopyYoung | 来源:发表于2017-03-28 13:28 被阅读0次

    2017.3.27 刷题开始

    博主最近忙于找实习,发现不少互联网的大公司,在线笔试以及面试中都会考一些基本的编程题目,而LeetCode正是收集这些题目的一个平台,所以博主决定从零刷起,希望有兴趣的小伙伴互相鼓励,共同进步。
    由于博主是博客小白,所以博客中的不成熟之处还请大家批判指正。LeetCode的刷题顺序处于摸索状态,目前是按照题号从易到难。这种网上OJ也是第一次开始刷,个人原创的算法中难免有不成熟之处,还希望大家多多指点。
    闲话少说,直奔主题。

    LeetCode(1.Two Sum)

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.
    You may assume that each input would have exactly one solution, and you may not use the same element twice.
    Example:
    Given nums = [2, 7, 11, 15], target = 9,
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 1].

    知识点:
    这道题应用了hash表的知识,具体用法可参见 C++ Reference;此外,我注意到LeetCode对vevtor的使用也比较多,题主此前对vector这个数据结构并不熟悉,所以此处也要强调一下,具体用法参见C++ Reference。

    解题思路:
    首先建立一个从int到int映射的hash表,将nums中的元素每一个都映射到hash表中。然后从头开始遍历nums,查找目标元素值是否在hash表中,如果没有则继续查找;如果有的话判断一下两个元素的下标是否相同,避免出现下标相同的情况。C++代码如下:

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            unordered_map<int, int> mapping;
            vector<int> ans;
            for (int i=0; i<nums.size(); ++i)
                mapping[nums[i]] = i;
            for (int i=0; i<nums.size(); ++i){
                int search = target - nums[i];
                if (mapping.find(search) != mapping.end() && mapping.at(search) != i){
                    ans.push_back(i);
                    ans.push_back(mapping.at(search));
                    break;
                }
            }
            return ans;
        }
    };
    

    时间复杂度分析:
    该算法时间复杂度为O(n)。建立hash表的时间复杂度为O(n);遍历nums在hash表中查找的时间复杂度也为O(n)。所以,整个算法的时间复杂度为O(n)。

    相关文章

      网友评论

          本文标题:LeetCode从零刷起 (1. Two Sum)

          本文链接:https://www.haomeiwen.com/subject/atcjottx.html