LeetCode——twosum

解题方法

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)