leetcode two sum
来源:互联网 发布:淘宝香火符咒 编辑:程序博客网 时间:2024/06/08 14:42
很经典的一道题。一个数组里找两个数相加等于目标值,输出两个数的位置。
实在没想出来什么好办法,有一个思路,按照快排的想法,每次选取一个随机标记,分为左右,然后根据标记和目标值的大小比较,缩小搜索范围,最终时间复杂度是O(nlogn).
不过想想就觉得很难code出来,所以最终还是采用了排序再二分查找的办法,很普通的算法。
另外要注意两个相同的数也要处理。
class Solution {public: vector<int> twoSum(vector<int> &numbers, int target) { vector<int> res; vector<int> indexes; int i; for (i = 0; i < numbers.size(); i++) { indexes.push_back(numbers[i]); } sort(numbers.begin(), numbers.end()); int n = numbers.size(); for (i = 0; i < n; i++){ int num = numbers[i]; int left = i+1, right = n-1, mid = (left + right) / 2 ; int tmpsum = -1; while (left <= right){ tmpsum = num + numbers[mid]; if (tmpsum == target)break; else if (tmpsum < target)left = mid + 1; else right = mid - 1; mid = (left + right) / 2; } if (tmpsum == target){ int a = -1, b = -1; for (int j = 0; j < n; j++){ if (indexes[j] == numbers[i] || indexes[j] == numbers[mid]){ if (a < 0)a = j + 1; else{ b = j + 1; break; } } } res.push_back(a); res.push_back(b); break; } } return res; }};
另一种用map的解法我也试过,但是时间花得多的多。而且用的是unordered_map,不知道是不是编译器的原因。
下面是别人的类似代码,写得不太漂亮:
vector<int> twoSum(vector<int> &numbers, int target) { int index1 = 0, index2 = 0; // Special Case: target = a + a, cannot be solved by map for (int i = 0; i < numbers.size(); ++i) { if (numbers[i] == target / 2) { if (index1 == 0) index1 = i + 1; else index2 = i + 1; } } if (index1 > 0 && index2 > 0) { vector<int> result { index1, index2 }; return result; } unordered_map<int, int> m; for (int i = 0; i < numbers.size(); ++i) m[numbers[i]] = i + 1; for (int i = 0; i < numbers.size(); ++i) { if (m[target - numbers[i]] && m[target - numbers[i]] != i + 1) { index1 = m[numbers[i]]; index2 = m[target - numbers[i]]; break; } } if (index1 > index2) { index1 ^= index2; index2 ^= index1; index1 ^= index2; } vector<int> result { index1, index2 }; return result;}
0 0
- 【Leetcode】Two Sum (Sum)
- LeetCode: Two Sum
- LeetCode: Two Sum
- [Leetcode] Two Sum
- LeetCode : Two Sum
- Leetcode: Two Sum
- leetcode 46: Two Sum
- [LeetCode] Two Sum
- LeetCode 1 - Two Sum
- Leetcode : Two Sum
- 【leetcode】Two Sum
- [LeetCode]Two Sum
- leetcode Two Sum
- [Leetcode] Two Sum
- [leetcode] Two Sum
- LeetCode - Two Sum
- leetcode之Two Sum
- LeetCode | Two Sum
- STM32使用PWM控制LED呼吸灯效果
- 感觉风华高科风格的服饰的规范化交换空间环境规划发给对方
- 笑着笑着笑着小城之春自行车
- 的正是典型的大城市向的诚信厂小厂小长v
- 北~京
- leetcode two sum
- GUI程序和CUI程序各自如何获取进程的环境变量
- 科技园颓废太妃糖发一
- 于仁泰一个
- POJ2352
- 反导系统
- 预提费用
- 一周学会Linux实战
- 计算机学院研发第二轮考核---------简述WebViewClient与WebChromeClient,浏览器之无痕浏览