13.leetcode题目1: Two Sum

来源:互联网 发布:中国食品安全问题数据 编辑:程序博客网 时间:2024/05/02 00:41

又是好几天没刷题了,这几天零零碎碎的面试。。。

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.

Example:

Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].

这个题拿到的第一眼反应就是:啊,不难嘛,不愧是第一题。。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        if(nums.empty())
        return res;
        //for(vector<int>::iterator iter=nums.begin();iter!=nums.end();++iter){
            //for(vector<int>::iterator iter1=iter+1;iter1!=nums.end();++iter1){
               // int sum=*iter+*iter1;
               // if(sum==target){
               // res.push_back(iter-nums.begin());
               // res.push_back(iter1-nums.begin());
               map<int, int> m;
               for(int i = 0; i < nums.size(); ++ i){
             if(m.find(target - nums[i]) != m.end()){
                 res.push_back(m[target - nums[i]] );
                 res.push_back(i);
                 break;
             }
             m[nums[i]] = i;
       }
                return res;
    }
};

第一思路是按注释掉的方法,对所有元素进行一个循环的两两相加,判断是否与target相等。

最后肯定是正确的,但是时间复杂度为O(n^2),所以提交的时候超时了没通过~~

那么肯定要降低时间复杂度,这里我又参考了网络上别人做的,对map、hashmap等容器的用法都不太了解。

map<int,int> m;//这句话表示建立一个空map对象m,其索引值为int类型,键值为int类型,

在这道题中的方法是:索引值存放nums元素,键值存放nums元素的下标。

m.find(k),如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器。

m[target - nums[i]] 代表索引值target - nums[i]对应的键值。

以后注意:涉及到查找某元素,可用map!!!


0 0
原创粉丝点击