LeetCode“数组类型”第1题——Two Sum

一、题目

中文:

二、代码

1、暴力法

暴力法很简单。遍历每个元素。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n=nums.size();
        vector<int> result;
        for(int i=0;i<n-1;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                int sum=nums[i]+nums[j];
                if(sum==target){
                    result.push_back(i);
                    result.push_back(j);
                    break;
                }
            }
        }
        
        return result;
    }
};

性能:

复杂度分析:

时间复杂度:O(n^2), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n)的时间。因此时间复杂度为 O(n^2)。

扫描二维码关注公众号,回复: 3396835 查看本文章

空间复杂度:O(1)。 

2、哈希表

用一个哈希表存储每个数对应的下标。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> mapping;
        vector<int> result;
        for(int i=0;i<nums.size();i++){
            mapping[nums[i]]=i;//用unordered_map先把数组中的数字和对应的下标存储一遍,即数字作为键,下标作为值存储。
        }        
        for(int i=0;i<nums.size();i++){
            const int gap=target-nums[i];//遍历数组的时候用target-nums[i],得到差gap,然后在nordered_map中找是否存在gap,找到即返回gap所在的值,即所对应的数组的下标。
            if(mapping.find(gap)!=mapping.end()&&mapping[gap]>i){
                result.push_back(i);
                result.push_back(mapping[gap]);
                break;
            }
        }
        return result;
    }
};

性能:

复杂度分析:

时间复杂度:O(n)。

空间复杂度:O(n)。  

三、知识点解析

1、map、hash_map、unordered_map的区别

http://www.cnblogs.com/ranjiewen/p/5328137.html

https://blog.csdn.net/zhc_24/article/details/78915968

2、mapping.find(gap)!=mapping.end()的解析

https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html

用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。

查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,

分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.

猜你喜欢

转载自blog.csdn.net/happiness_llz/article/details/82714753