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

LeetCode——twosum

时间:2015-03-10 11:45:07      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

解题方法

1、暴力解题法(时间复杂度O(n*n)):首先遍历每个元素,然后遍历剩下的元素,看是否满足x+y=target.

2、我们可以通过使用哈希图将值映射到索引将时间复杂度减少到O(n)

 

#include <iostream>
#include <windows.h>
#include <time.h>
#include <vector>
#include <unordered_map>
using namespace std;
class Solution
{
public:
    vector<int>twoSum(vector<int> &numbers,int target)
    {
        unordered_map<int, int>mapping;
        vector<int>result;
        for (int i = 0; i < numbers.size();i++)
        {
            mapping[numbers[i]] = i;
        }
        for (int i = 0; i < numbers.size();i++)
        {
            const int gap = target - numbers[i];
            if (mapping.find(gap)!=mapping.end()&&mapping[gap]>i)
            {
                result.push_back(i + 1);
                result.push_back(mapping[gap]+1);
                break;
            }
        }
        return result;
    }
};
int main()
{
    Solution sum;
    vector<int>numbers= {2,7,11,15};
    int target = 9;
    time_t clockbegin, clockend;
    clockbegin = clock();
    sum.twoSum(numbers, target);
    clockend = clock();
    //cout << "花费时间为:" << clockend - clockbegin << endl;
    printf("%ld\n",clockend-clockbegin);
    getchar();
    return 0;
}

 

注:返回类型为按索引大小排列好的result,使用unordered_map进行查找,复杂度为O(n)

如果使用现排序在查找的话,破坏了数据,此题要求返回的是数据的索引,因此这种方法是错误的。

如果所给数据是已经排序好的话,使用二分法查找然后进行判断,时间复杂度是O(nlogn)。

LeetCode——twosum

标签:

原文地址:http://www.cnblogs.com/jingliming/p/4325437.html

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