标签:
在解决本道题时,最先想到的思路是用两个指针,一个在前,一个紧随其后。然后后面的指针的不断向后移动直到找到匹配的元素或者到达数组的末端。再不断进行下次迭代。代码如下:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>::iterator iter1, iter2;
vector<int> result;
iter1 = nums.begin();
iter2 = nums.begin();
for(; iter1 != nums.end() - 1; iter1++) {
result.clear();
result.push_back((iter1 - nums.begin()) + 1);
for(iter2 = iter1 + 1; iter2 != nums.end(); iter2++) {
if(*iter1 + *iter2 == target) {
result.push_back((iter2 - nums.begin()) + 1);
return result;
}
}
}
}
};
int main() {
vector<int> nums;
nums.push_back(3);nums.push_back(2);nums.push_back(4);nums.push_back(15);
Solution solution;
cout << solution.twoSum(nums, 7)[0] << endl;
cout << solution.twoSum(nums, 7)[1] << endl;
getchar();
}
提交后的结果是time limit exceed。因为该算法的时间效率是
我们在上面代码中做的基本操作是不断比较后面的元素是否与某个值是否相等,将这种比较操作转换成查找操作,即查找在后面的元素是否存在这样的值。而对于map容器,查找操作可以在
有用的知识点: 1、将比较操作转化为查找操作。 2、如果使用c++中map类型容器,因为她在底层是用树来实现的,所以其查找操作的的时间效率为 |
使用map类型容器的代码如下,运行时间为24ms:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> tree_map;
vector<int> result;
int length = nums.size();
for(int i = 0; i < length; i++) {
if(tree_map.count(target - nums[i])) {
result.push_back(tree_map[target - nums[i]] + 1);
result.push_back(i + 1);
return result;
}
tree_map[nums[i]] = i;
}
}
};
使用unordered_map类型容器的代码如下,运行时间为16ms:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash_map;
vector<int> result;
int length = nums.size();
for(int i = 0; i < length; i++) {
if(hash_map.count(target - nums[i])) {
result.push_back(hash_map[target - nums[i]] + 1);
result.push_back(i + 1);
return result;
}
hash_map[nums[i]] = i;
}
}
};
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/guanzhongshan/article/details/46822623