码迷,mamicode.com
首页 > 其他好文 > 详细

OJ练习40——T1 Two Sum

时间:2015-05-04 17:42:51      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

练习1-39是简单题目,练习40开始做中级题目。

找到一个序列中的两个序号,要求该序号对应的两个数和为指定值。

【思路】

1.暴力解决:大循环遍历作为左数,小循环从下一个开始遍历作为右数,时间复杂度是O(n^2)。——竟然不让我通过%>_<%

2.哈希散列,用map<int, int>实现,序号(左值)是原序列中的值,保存的值(右值)是原序列的序号,每次从map中遍历。(try)

3.别人的办法:用unordered_map类,没见过。

        ——2、3的思路:遍历原序列的值,而不是原序列的索引,可以减少一个级的复杂度(n^2到n)。

4.c的思路:先排序,然后用快排思想,一个在头一个在尾,比较头尾两数的和与指定值的大小。

【思路2+3 other code】

vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> result(2);
        map<int,int> intMap;//思路2
//unordered_map<int,int> intMap;//思路3
for(int i=0; i<nums.size(); ++i){ if(intMap.find(target-nums[i]) != intMap.end()){ result[0] = intMap[target-nums[i]] + 1; result[1] = i + 1; return result; } intMap[nums[i]] = i; } }

【结果】

用思路3的unordered_map耗时20ms,排名居中;

用思路2的map耗时39ms,排名最后,可见散列表的效率要更高些。

find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。

这个“键值”就是指“序号”,当遇到一个未曾出现过的键,那么映射表会自动创建一个具有这个键的新元素。

【思路4】

留到明天。

 

OJ练习40——T1 Two Sum

标签:

原文地址:http://www.cnblogs.com/ketchups-notes/p/4476571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!