1. 2Sum---Array--HashMap--LeetCode
来源:互联网 发布:陕西易通网络服务公司 编辑:程序博客网 时间:2024/06/04 17:48
1. 笨办法O(N2)
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> output; for(int i = 0; i < nums.size(); ++i) { for(int m = i + 1; m < nums.size(); ++m) { if(nums[i] + nums[m] == target) { output.push_back(i); output.push_back(m); std::sort(output.begin(), output.end()); return output; } } } return output; }};
2. 超时,看不出结果正确与否
对原数据排序,再比较
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> input(nums); vector<int> output; std::sort(input.begin(), input.end()); int i = 0, j = input.size() - 1; while(i < j) { int sum = input[i] + input[j]; if(sum > target) --j; else if(sum < target) ++i; else { output.push_back(input[i]); output.push_back(input[j]); // 找值i、j对应的下标 int index1, index2; for(int i = 0; i < input.size(); ++i) { if(input[i] == output[0]) { index1 = i; break; } } for(int i = 0; i < input.size(); ++i) { if(input[i] == output[1]) { index2 = i; break; } } output.clear(); if(index1 <= index2) { output.push_back(index1); output.push_back(index2); } else { output.push_back(index2); output.push_back(index1); } } } return output; }};
但是新建一个结构体,存储原始下标,O(N)
class Solution {public: struct CNumSet { int val; int index; CNumSet(int v, int i) :val(v), index(i) {} }; static bool myOrder(struct CNumSet a, struct CNumSet b) { return (a.val <= b.val); }public: vector<int> twoSum(vector<int>& nums, int target) { vector<CNumSet> v; vector<int> output; for(int i = 0; i < nums.size(); ++i) v.push_back(CNumSet(nums[i], i)); std::sort(v.begin(), v.end(), myOrder); for(int i = 0, j = v.size() - 1; i <= j; ) { int sum = v[i].val + v[j].val; if(sum < target) ++i; else if(sum > target) --j; else { output.push_back(v[i].index); output.push_back(v[j].index); std::sort(output.begin(), output.end()); return output; } } return output; }};
法4:用unordered_map,通过vector的值,查找vector的下标
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> myMap; vector<int> output; int sz = nums.size(); for(int i = 0; i < sz; ++i) myMap[nums[i]] = i; // map的键是vector的值,map的值是vector的下标(因为map是按照键查找,O(1)时间) for(int i = 0; i < sz; ++i) { int anotherNumber = target - nums[i]; if(myMap.find(anotherNumber) != myMap.end()) { int anotherIndex = myMap[anotherNumber]; if(anotherIndex == i) continue; else { output.push_back(i); output.push_back(anotherIndex); std::sort(output.begin(), output.end()); return output; } } } return output; }};
(map和unordered_map里的键是唯一的,不可能重复,否则查找一个键会出现2个值)
参考https://discuss.leetcode.com/topic/3294/accepted-c-o-n-solution
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> myMap; vector<int> output; int sz = nums.size(); // /for(int i = 0; i < sz; ++i) // myMap[nums[i]] = i; // map的键是vector的值,map的值是vector的下标(因为map是按照键查找,O(1)时间) for(int i = 0; i < sz; ++i) { int anotherNumber = target - nums[i]; if(myMap.find(anotherNumber) != myMap.end()) // O(1) { int anotherIndex = myMap[anotherNumber]; output.push_back(i); output.push_back(anotherIndex); std::sort(output.begin(), output.end()); return output; } else // 若没找到anotherNumber,把nums[i]放进myMap。若(在之前已放入myMap的元素中)找到了,结束。 myMap[nums[i]] = i; // 如果nums[i]重复,会被覆盖。如原来nums为{3,2,2,4,3,5}, // 则myMap剩下{(3, 0), (2, 1), (4, 2), (5, 3)} } return output; }};
0 0
- 1. 2Sum---Array--HashMap--LeetCode
- 1.Two Sum leetcode(array)
- LeetCode-Array-1. Two Sum
- leetcode.array--1. Two Sum
- Leetcode ☞ 1. Two Sum ☆ 【Hashmap】
- LeetCode: 2 Sum (Input array is sorted)
- [Week 2] [Leetcode][Array] Two Sum
- LeetCode[Array]----3Sum
- LeetCode[Array]---- 4Sum
- 15.3sum leetcode(array)
- LeetCode--Array---4Sum
- LeetCode-1-Two-Sum HashMap
- Leetcode - Pointers/Array - Two sum
- LeetCode[Array]----3Sum Closest
- LeetCode: Split Array Largest Sum
- [Leetcode] Split Array Largest Sum
- LeetCode刷题【Array】 Two Sum
- Array -- Leetcode problem1. Two Sum
- lintcode删除排序链表重复数字
- CollapsingToolbarLayout 布局报错问题解决
- Linux下文件的压缩与解压缩
- 稀疏化鲁棒最小二乘支持向量机与多目标遗传优化
- 充分必要条件的理解
- 1. 2Sum---Array--HashMap--LeetCode
- DHCP过程描述(双版本)
- 【Java每日一题】20161207
- CSS图文混排
- 巧妙之道出天工-网页展示之图片裁切技巧
- JSP文件经Tomcat编译后的文件位置
- 使用 Freeline 纪录篇
- css中单位px、pt、em和rem的区别
- A Scala Tutorial for Java programmers