标签:
解题方法
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)。
标签:
原文地址:http://www.cnblogs.com/jingliming/p/4325437.html