Two Sum-n方优化与C++map的使用
2015-06-26 12:32
399 查看
LeetCode第一题,刚拿到题目时虽然明知道n方的遍历算法会超时,但还是不信邪的提交了一次,然而编程不存在运气,TLE不可避免。但是之后的思维方式比较直接,我并没有立刻想到O(n)的方法,想了一种先对数组进行排序,利用目标数和待选择的数的关系来减小搜索范围:
1.不存在负数:那么比目标数大的数不必搜索
2.存在负数:搜索负数和比目标大的数,或者搜索正数比目标小的数;这种情况还存在全为负数,只能按照最差的n方方式搜索。
按照这个优化思路,虽然算法严格意义上来说是n方复杂度的,但是实际性能并不一定这么差,以下是AC代码:
map
本想再试一下hashmap,但是由于并不是标准C++库,所以需要以下头文件和命名空间:
才可以在linux上的Eclispe里编译,但是提交发现leetcode的评测环境并不支持以上库,也就没有再试,但是看到网上很多推荐使用unordered_map:
使用方法和map,hashmap类似。
PS:
这个题目的数据并不是排好序的!
以下是几组容易wa的测试数据:[-1,-2,-3,-4,-5] -8 ,[0,3,4,0] 0,[-3,4,3,90] 0。
这个题目也是逆向思维的简单应用,并不需要复杂的算法和精妙的构思,反转一下足够。
1.不存在负数:那么比目标数大的数不必搜索
2.存在负数:搜索负数和比目标大的数,或者搜索正数比目标小的数;这种情况还存在全为负数,只能按照最差的n方方式搜索。
按照这个优化思路,虽然算法严格意义上来说是n方复杂度的,但是实际性能并不一定这么差,以下是AC代码:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { map<int, int> datamap; vector<int> res; int i; int n=nums.size(); for(i=0;i<n;i++) datamap[nums[i]]=i; map<int,int>::iterator it; for(i=0;i<n;i++) { it=datamap.find(target-nums[i]); if(it!=datamap.end()&&it->second!=i) { if(i>it->second){ res.push_back(it->second + 1); res.push_back(i + 1); } else { res.push_back(i + 1); res.push_back(it->second + 1); } break; } } return res; } };
map
本想再试一下hashmap,但是由于并不是标准C++库,所以需要以下头文件和命名空间:
#include <ext/hash_map> using namespace __gnu_cxx;
才可以在linux上的Eclispe里编译,但是提交发现leetcode的评测环境并不支持以上库,也就没有再试,但是看到网上很多推荐使用unordered_map:
#include <tr1/unordered_map>
使用方法和map,hashmap类似。
PS:
这个题目的数据并不是排好序的!
以下是几组容易wa的测试数据:[-1,-2,-3,-4,-5] -8 ,[0,3,4,0] 0,[-3,4,3,90] 0。
这个题目也是逆向思维的简单应用,并不需要复杂的算法和精妙的构思,反转一下足够。
相关文章推荐
- 《爱编程,爱c++-十八期-对象》
- C++编译错误
- c++读书笔记之表达式
- 学习C++ -> 构造函数与析构函数
- 详解C/C++函数指针声明
- 在什么情况下Java比C++快?
- c++中的引用
- c++中的引用
- c++重点知识点
- c++常用函数学习--------exit() 与atexit()的区别:
- c++重点知识点
- c#委托基础;c#委托Vs C++函数指针
- fflush(stdin)
- c++模板类学习
- Effective C++ 条款22
- 设计模式----------------------观察者模式
- C语言函数回调
- 单链表的插入删除操作(c++实现)
- C++指向const对象的指针和const指针
- c++多线程