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

leetecode two sum

时间:2015-09-07 13:01:26      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:two sum

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2


解答一:

第一遍,遍历数组,用hash表记录数字的下标,如果有多个,则按顺序从前到后存储,

第二遍,遍历数组,查表,a,target-a  如果target-a存在,这时分两种情况,

    1.a==target-a,依据vector<int> size是否大于1,如果大于,则已经找到,可以返回,

    2.如果不等于,则看table【target-a】是否存在,如果存在,已经找到。

unordered_map<int,vector<int>> table


代码:

class Solution {

public:

    vector<int> twoSum(vector<int>& nums, int target) {

        unordered_map<int,vector<int>> table;

        int size=nums.size();

        if(size==0)

            return vector<int>();

        vector<int> results;

        

        for(int i=0;i<size;++i){

            table[nums[i]].push_back(i+1);

        }

        

        for(int i=0;i<size;++i){

            int res=target-nums[i];

            if(res==nums[i]){

                if(table[nums[i]].size()>1){

                    results.push_back(table[res][0]);

                    results.push_back(table[res][1]);

                    break;

                }

            }

            else{

                unordered_map<int,vector<int> >::const_iterator itor=table.find(res);

                if(itor!=table.end()){

                    results.push_back(i+1);

                    results.push_back(table[res][0]);

                    break;

                }

            }

        }

        return results;

    }

};


解法二:

    由法一可以看出,如果存在两个数的和为target,则a,b这两个数出现的顺序必然不同,则可以通过当一个数为a时,查看b是否已经存入到hash里,如果有则已经找到,可以返回,

如果没有,则保存到hash里,继续遍历,该方法理想复杂度为o(n)

class Solution {

public:

    vector<int> twoSum(vector<int>& nums, int target) {

        unordered_map<int,vector<int>> table;

        int size=nums.size();

        if(size==0)

            return vector<int>();

        vector<int> results;

        

        for(int i=0;i<size;++i){

            int res=target-nums[i];

            unordered_map<int,vector<int> >::const_iterator itor=table.find(res);

            if(itor!=table.end()){

                results.push_back((itor->second)[0]);

                results.push_back(i+1);

                break;

            }

            else

                table[nums[i]].push_back(i+1);

        }

        return results;

    }

};


leetecode two sum

标签:two sum

原文地址:http://searchcoding.blog.51cto.com/1335412/1692211

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