关闭

LeetCode || Two Sum

283人阅读 评论(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;
        }
    }
};

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:48674次
    • 积分:2306
    • 等级:
    • 排名:第16878名
    • 原创:190篇
    • 转载:5篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论