[Leetcode]1. Two Sum

来源:互联网 发布:ipad pro 记笔记 知乎 编辑:程序博客网 时间:2024/05/17 08:22

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution.

Example:

Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].

这题是leetcode的第一题,我一开的想法是,定义两个迭代器iter1 = nums.begin(), iter2 = iter1 + 1; 然后for循环中嵌套for循环遍历vector,结果测试显示Time Limit Exceeded,时间超过了。开始的代码是这样的:

class Solution {public:    vector<int> twoSum(vector<int>& nums, int target) {        vector<int> vec;        for (auto iter1 = nums.begin(); iter1 != nums.end() - 1; ++iter1)            for (auto iter2 = iter1 +1; iter2 != nums.end(); ++iter2)                if (*iter1 + *iter2 == target)                {                    vec.push_back(iter1 - nums.begin());                    vec.push_back(iter2 - nums.begin());                }        return vec;    }};
后来想了个办法,先排序,然后用两个迭代器向中间靠近,不过运行的时候Memory Limit Exceeded,这时代码如下:

class Solution {public:    vector<int> twoSum(vector<int>& nums, int target) {        vector<int> vec(nums);        vector<int> index;        sort(vec.begin(), vec.end());        auto iter1 = vec.begin();        auto iter2 = vec.rbegin();        while (*iter1 != *iter2)        {            if (*iter1 + *iter2 == target)            {                for (auto i = 0; i != nums.size(); ++i)                {                    if (*iter1 == nums[i])                        index.push_back(i);                    if (*iter2 == nums[i])                        index.push_back(i);                }            }            else if (*iter1 + *iter2 > target)                ++iter2;            else                ++iter1;        }        return index;    }};
经过思考,想到了用<value, index>映射表,遍历nums,寻找target-nums[i],如果找到,则返回target-nums[i]的index,和当前的index;若没找到则将<nums[i], i>加入映射表,代码如下:

class Solution {public:    vector<int> twoSum(vector<int>& nums, int target) {        vector<int> vec;        unordered_map<int, int> um;        for(int i = 0; i < nums.size(); i ++)        {            if(um.find(target - nums[i]) == um.end())                um[nums[i]] = i;            else            {                vec.push_back(um[target - nums[i]]);                vec.push_back(i);            }        }    return vec;    }};

0 0
原创粉丝点击