LeetCode || Two Sum

原创 2015年07月09日 22:24:28

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

#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 刷题题解(c++) 1.Two Sum (hash表,排序+二分查找)

c++刷leetcode,有题目和算法代码,可直接在leetcode提交通过。
  • GOGO_YAO
  • GOGO_YAO
  • 2016年07月24日 20:59
  • 542

【LeetCode编程学习(C语言)】1.Two Sum

LeetCode编程之简单篇,两个数求和,采用穷举和hash对比
  • yake827
  • yake827
  • 2016年03月28日 13:39
  • 4278

leetcode 1: 找出两个数相加等于给定数 two sum

问题描述对于一个给定的数组,找出2个数,它们满足2个数的和等于一个特定的数,返回这两个数的索引。(从1开始) Given an array of integers, find two numbers...
  • quzhongxin
  • quzhongxin
  • 2015年04月24日 11:08
  • 1495

leetcode--TWO SUM延伸(假设答案不唯一、假设输入有相同数字)

leetcode中的TWO SUM对结果进行了限制,You may assume that each input would have exactly one solution. 但是考虑实际情况,...
  • u010523205
  • u010523205
  • 2015年07月14日 21:29
  • 408

LeetCode题解--1. Two Sum(和为S的两个数字)

题目地址https://leetcode.com/problems/two-sum/ 描述给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。要求:这个函数twoSum必须要返回能够相加等于...
  • gatieme
  • gatieme
  • 2016年01月27日 22:32
  • 3876

【python】【leetcode】【算法题目2—Add Two Numbers】

【python】【leetcode】【算法题目2—Add Two Numbers】 题目原文: You are given two linked lists representing two non-...
  • u014615155
  • u014615155
  • 2016年11月21日 12:05
  • 1786

LeetCode奇幻漂流(一)Two Sum

从大一开始就接触ACM,到入职后做OJ题,在提交答案后AC以后的成就感,确实是无与伦比得快乐。貌似又扯远了,最近刚刚接触到leetcode(据说是各大互联网公司面试考基础的参考题目),因此无论你之前是...
  • u012155923
  • u012155923
  • 2016年04月22日 22:49
  • 432

算法系列--Two Sum

继续算法系列。今天再看一道leetcode(www.leetcode.com)的题目。问题描述原文 Given an array of integers, find two numbers suc...
  • ylyg050518
  • ylyg050518
  • 2015年09月13日 23:34
  • 832

LeetCode修仙:Two Sum详解

不重要: 最近天天玩吃鸡,优点颓废,好好坚持刷一下LeetCode,本博客力求一题多解,从时间复杂度上完成自我代码修养的提高。 problem: Given an array of integer...
  • Errors_In_Life
  • Errors_In_Life
  • 2018年01月14日 19:53
  • 38

leetcode编程笔记(一)——two sum

1. 题目输入一个数组nums[],根据所给的target(目标数),返回两个元素的索引x、y, 假定:nums[x]+nums[y]=target且x,y唯一2. 算法分析得到目标元素需要将每个元...
  • HW_dx
  • HW_dx
  • 2016年07月14日 19:23
  • 71
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode || Two Sum
举报原因:
原因补充:

(最多只允许输入30个字)