1、Two Sum

  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这个网站,这个刷题网站的确很不错,可以在线编译报错,也可以选择不同的代码去实现,最关键的是它还考察时间复杂度,这就需要去思考最优化算法。

  很多题目都是一些公司的笔试题,很实用,以后要坚持刷题了。怎么说每天至少一道题,把编程变成习惯,而且我在一些博客上也看到很多人说数据结构和算法很重要,开来这是一个不争的事实了。

  以后刷题每道题都要用C、C++、JavaScript去实现,虽然可能没什么大作用,但是我觉得对于熟悉不同语言的机制还是很有帮助的。

  因为在这里刷题,我才开始接触C++STL泛型编程,发现这对于ACM确实是个不错的东西。

  第一题我首先想到的是暴利算法,使用双for循环,中间再嵌套一个if语句进行判断,正确就返回。但是时间复杂度不允许,是O(n^2)。

 1 class Solution {
 2    public:
 3          vector<int> twoSum(vector<int> &numbers, int target) {
 4            vector<int> result;
 5            for (int i = 0; i < numbers.size()-1; i++) {
 6                for (int j = i+1; j < numbers.size(); j++) {
 7                    if (numbers[i] + numbers[j]==target) {
 8                        result.push_back(i+1);
 9                        result.push_back(j+1);
10                       return result;
11                   }
12               }
13           }
14           return result;
15       }
16   };

  然后就想到了用map容器实现

 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& numbers, int target) {
 4         vector<int> result;
 5         map<int, int> m;
 6         if (numbers.size() < 2)
 7             {return result;}
 8         for (int i = 0; i < numbers.size(); i++)
 9            { m[numbers[i]]= i;}
10         map<int, int>::iterator it;
11         for (int i = 0; i < numbers.size(); i++) {
12             if ((it = m.find(target - numbers[i])) != m.end())
13             {
14                 if (i == it->second) continue;
15                 result.push_back(i);
16                 result.push_back(it->second);
17                 return result;
18             }
19         }
20         return result;
21     }
22 };

 

posted on 2016-04-05 22:37  suvllian  阅读(261)  评论(0)    收藏  举报