1. Two Sum
2015-06-30 20:14
351 查看
这道题,总的来说,共有两种解法。一种解法是双指针扫描,向中间进行夹逼。时间复杂度为O(nlogn)。但是为了保存下标,需要加个结构体,所以还是挺麻烦的,代码如下:
vector<int> twoSum(vector<int>& nums, int target) { int len = (int)nums.size(), i, sum; vector<int> result; num_pos mapping[len]; for (i=0; i<len; i++) { mapping[i].num = nums[i]; mapping[i].pos = i+1; } qsort(mapping, len, sizeof(mapping[0]), cmp); int p = 0, q = len-1; while (p < q) { sum = mapping[p].num + mapping[q].num; if (sum > target) { q--; } else if (sum < target) { p++; } else { if (mapping[p].pos < mapping[q].pos) { result.push_back(mapping[p].pos); result.push_back(mapping[q].pos); } else { result.push_back(mapping[q].pos); result.push_back(mapping[p].pos); } break; } } return result; }另外一种解法是利用Map。C++中的Map是利用红黑树实现的,搜索效率为O(logN)。利用Map的算法思想如下:遍历vector,当下标为i时,我们检测nums[i]是否可以在remain_index中找到,如果找到,break。找不到,就把target-nums[i]放到remain_index中,代码如下:
vector<int> twoSum(vector<int>& nums, int target) { map<int, int> remain_index; vector<int> result; int len = (int)nums.size(); for (int i = 0; i < len; i++) { if (remain_index.find(nums[i]) != remain_index.end()) { // 找到了 int index =remain_index[nums[i]]; result.push_back(index+1); result.push_back(i+1); break; } else { remain_index[target-nums[i]] = i; // 找不到 } } return result; }
相关文章推荐
- 调用安卓相机闪退
- java GC 栈(虚拟机栈,本地方法栈),堆(新生代、老年代), 方法区(永久带)等参数配置
- [QML] Connections元素介绍
- 底部弹出popWindow的动画
- H264(NAL简介与I帧判断)
- NSString 筛选和最后一个空白、空行,多换行成一个新行
- 什么是“宏”?
- Oracle数据库备份与恢复
- Android按钮单击事件的四种常用写法总结
- tableView - 点击加载更多(通知)
- windows系统下Python环境的搭建
- Spring IOC-Servlet加载到bean工厂
- Redis系列(五)-Opserver的监控
- AXD Error:Processor ARM79_0 raised an exception. Cause: The processor was reset
- Oracle DDL基本操作
- synchronized用于静态方法和普通方法区别
- 常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全
- 原子钟
- 常见快捷键
- IT技术博客收藏