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

LeetCode || Two Sum

时间:2015-07-10 09:32:42      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

在解决本道题时,最先想到的思路是用两个指针,一个在前,一个紧随其后。然后后面的指针的不断向后移动直到找到匹配的元素或者到达数组的末端。再不断进行下次迭代。代码如下:

#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。因为该算法的时间效率是θ(n2),所以出现运行时间过长。

我们在上面代码中做的基本操作是不断比较后面的元素是否与某个值是否相等,将这种比较操作转换成查找操作,即查找在后面的元素是否存在这样的值。而对于map容器,查找操作可以在θ(lgn)或者θ(1)内完成,所以这将提高算法的时间效率。

有用的知识点:
1、将比较操作转化为查找操作。
2、如果使用c++中map类型容器,因为她在底层是用树来实现的,所以其查找操作的的时间效率为θ(lgn);如果使用c++中unordered_map类型容器,因为她在底层是用hash表来实现的,所以其查找操作的的时间效率为θ(1)

使用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;
        }
    }
};

下面是参考文章:
参考文章一
参考文章二

版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode || Two Sum

标签:

原文地址:http://blog.csdn.net/guanzhongshan/article/details/46822623

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