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 };
欢迎关注我的Github:https://github.com/suvllian