LeetCode之1—-Two Sum

来源:互联网 发布:flicker.js 编辑:程序博客网 时间:2024/05/01 14:45

题目:

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.


题目大意:

给定一个数组和一个目标值,返回数组中两个数字加起来等于该目标值的下标。


思路:很容易想到暴力求解法,时间复杂度是O(n^2),因为题目的Tag是easy,所以抱着试试的态度试了试。。。。结果可想而知。。。超时!!

#include <iostream>#include <cstdlib>#include <vector>class Solution {public:    std::vector<int> twoSum(std::vector<int> &nums, int target) {        for (int i = 0; i < nums.size(); ++i) {            for (int j = 0; j < nums.size(); ++j) {                if (i == j) {                    continue;                } else {                    if (nums[i] + nums[j] == target) {                        v.push_back(i);                        v.push_back(j);                        break;                    }                }            }            if (v.size() != 0) {                break;            }        }        return v;    }private:    std::vector<int> v;};int main(int argc, char *argv[]){    std::vector<int> nums({2, 7, 11, 15});    int target = 9;    Solution s;    std::vector<int> v = s.twoSum(nums, target);    for (auto a : v) {        std::cout << a << " ";    }    std::cout << std::endl;        return EXIT_SUCCESS;}

看来得另辟蹊径了。超时的原因是时间复杂度太高,降低时间复杂度的方法就是使用hash来降低查找的次数从而达到降低时间复杂度的目的。由于使用C++语言进行编程,所以自然而然就想到了使用map容器来将数字和target建立联系。这里可以使用数组的元素值来表示map的key,使用数组的下标作为map的value,达到在O(1)时间迅速查找到对应值的下标。所以可以将时间复杂度降低到O(n)。

代码:

class Solution {public:    std::vector<int> twoSum(std::vector<int> &nums, int target) {                for (int i = 0; i < nums.size(); ++i) {            tmp[nums[i]] = i;        }                for (int i = 0; i < nums.size(); ++i) {            if (tmp.find(target - nums[i]) != tmp.end() && i != tmp[target - nums[i]]) {                v.push_back(i);                v.push_back(tmp[target- nums[i]]);                break;            }        }                return v;    }private:    std::vector<int> v;    std::map<int, int> tmp;};
  

好吧,AC是AC了可是效率还是不高,28ms,比起效率最高的4ms差距好大好大!!!好吧。。。再优化一下吧,经过思考发现上边的两个for语句可以合并成一个for语句,这样的话在一些特殊情况下可以减少循环的次数。所以就有了以下的代码,运行效率比之前少了4ms。然而还是离4ms差距好大!!!然而我并没有在答案里边找到4ms的方法,大多数高赞方法都是运行都是答案错误。可能是因为问题的边界检查更新了的缘故吧。

  
class Solution {public:    std::vector<int> twoSum(std::vector<int> &nums, int target) {                /*for (int i = 0; i < nums.size(); ++i) {            tmp[nums[i]] = i;        }        */        for (int i = 0; i < nums.size(); ++i) {            if (tmp.find(target - nums[i]) != tmp.end() && i != tmp[target - nums[i]]) {                v.push_back(tmp[target- nums[i]]);                v.push_back(i);                break;            } else {                tmp[nums[i]] = i;            }        }                return v;    }private:    std::vector<int> v;    std::map<int, int> tmp;};

0 0
原创粉丝点击