码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 1. Two Sum

时间:2018-05-31 19:25:14      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:amp   include   str   span   std   标记   直接   two sum   判断   

给定数组和一个值,求数组中两个数和为该值时,两个数的标号。结果单一,不能选取同一个数两次。

 

#include <unordered_map>
#include <cstdio>
using namespace std;

class Solution {
public:

vector<int> twoSum(vector<int> &nums, int target) {
    vector<int> ans;
    int n=nums.size();
    unordered_map <int,int>m;
    for (int i=0;i<n;i++){
        if (m.find(target-nums[i])!=m.end()) {
            ans.push_back(m.find(target-nums[i])->second);
            ans.push_back(i);
            return ans;
        }
        m.insert(pair<int,int>(nums[i],i));
    }
}
    
};

 

思路:

  因为没给数据范围,一开始想到的是类似桶排那样,开数组flag[],将给定的数组中出线的值在flag中标记。然后循环判断target-x是否存在。

  实际上桶排也是一种hash,只不过hash函数简单,即hash=x。因为不考虑元素重复的问题,加快检索速度,采用 unordered_map 存储(类似hash)。另外solution中也提到,可以one-pass loop完成,即在将值添加到map的时候就判断target-x是否存在即可。

 

出现的问题:

  1. map<int,int>::iterator iter; 可以写成 auto iter;

  2. 可以直接 return{m.find(target-nums[i])->second , i};

  3. STL中,vector 不能用 [] 赋值,只能 push_back(); map.find() 是对第一个关键字进行检索,不是第二个。

Leetcode 1. Two Sum

标签:amp   include   str   span   std   标记   直接   two sum   判断   

原文地址:https://www.cnblogs.com/travelller/p/9117904.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!