leetcode题解 1.TwoSum

Posted on 2018-03-28 21:30  wangziyan  阅读(186)  评论(0)    收藏  举报

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].

思路1:暴力的一种方法,将nums的所有两个数字都尝试一遍
两个for循环,时间复杂度为O(n^2),空间复杂度为O(1).

需要复习的知识:vector的使用:
定义一个vector类: vector<int> result;
定义一个返回vector的函数: vector<int> twoSum(vector<int>& nums,int target)
以及vector类中包含的数据的个数: nums.size() 记得括号不能丢
vector在尾部再加入一个数据: result.push_back(i);

代码部分:
class Solution{
public:
    vector<int> twoSum(vector<int>& nums,int target)
    {
      vector<int> result;
      for(int i=0;i<nums.size();i++)//nums.size()一定记得要带括号哦
      {
        for(int j=i+1;j<nums.size();j++)//important to be i+1 not i
        {
          if(nums[i]+nums[j]==target)
          {
            result.push_back(i);
            result.push_back(j);
            return result;
          }
        }
      }
    }
};
思路2:使用哈希表的解法
其实刚刚的思路可以转换为,我们选择了一个数字以后,下一个选择的数字就必须是target减去这个数字。
刚刚的思路其实就是通过再次的遍历来寻找这个数字。而这个寻找的过程可以简化。
简化的方式就是使用哈希表(让在数组的每个元素对应一个key然后就可以查询)。
通过使用这一次哈希就一下子让再次寻找的时间复杂度从O(n)降到了O(1)。(当然,这是在哈希表没有发生冲突的情况下)
而我们可以设计这样一个O(1)的哈希表。

需要复习的知识:
需要准备的知识主要就是怎么创建一个比较合适的哈希表,网上使用比较多的就是unordered_map
用法:
[查找元素是否存在]
    若有unordered_map<int, int> mp;查找x是否在map中
    方法1:  若存在  mp.find(x)!=mp.end()
    方法2:  若存在  mp.count(x)!=0
[插入数据]
    map.insert(Map::value_type(1,"Raoul"));
[遍历map]
    unordered_map<key,T>::iterator it;
    (*it).first;        //the key value
    (*it).second   //the mapped value
    for(unordered_map<key,T>::iterator iter=mp.begin();iter!=mp.end();iter++)
          cout<<"key value is"<<iter->first<<" the mapped value is "<< iter->second;

代码部分:
class Solution{
public:
        vector<int> twoSum(vector<int>& nums,int target)
        {
            vector<int> result;
            unordered_map<int,int> uMap;
            int res=0;
            for(int i=0;i<nums.size();i++)
            {
                res=target-nums[i];
                unordered_map<int,int>::iterator it=uMap.find(res);
                if(it!=uMap.end())
                {
                    result.push_back(it->second);
                    result.push_back(i);
                    return result;
                }
                uMap[nums[i]]=i;
            }
        }
};