标签:
练习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】
留到明天。
标签:
原文地址:http://www.cnblogs.com/ketchups-notes/p/4476571.html