题目:http://oj.leetcode.com/problems/two-sum/
- 题意:给出一个数组arry和一个数target,在数组中找到两个数,使他们的和为target,从小到大输出这两个数的下标。
- 思路:
1、直接查找,超时,时间复杂度O(n^2)。
2、排序,二分查找,时间复杂度O(nlog(n))。
3、HashMap把每个数存如map中,将查找两个数的和变为查找是否有一个数等于target - numbers[i],时间复杂度O(n)。
4、对HashMap的优化。 - 代码:
//思路2
struct Node{
int id, num;
};
bool cmp(Node A, Node B){
return A.num < B.num;
}
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
int len = numbers.size();
vector<int> answer;
Node node[len];
for (int i = 0; i < len; i++)
{
node[i].id = i + 1;
node[i].num = numbers[i];
}
sort(node, node + len, cmp);
int left = 0, right = len - 1;
while (left < right)
{
int mid = node[left].num + node[right].num;
if (mid == target)
{
if (node[left].id > node[right].id)
{
answer.push_back(node[right].id);
answer.push_back(node[left].id);
}
else
{
answer.push_back(node[left].id);
answer.push_back(node[right].id);
}
break;
}
else if (mid > target)
{
right--;
}
else
{
left++;
}
}
return answer;
}
};
//思路3
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> res;
int length = numbers.size();
map<int,int> mp;
for(int i = 0; i < length; ++i)
mp[numbers[i]] = i;
map<int,int>::iterator it = mp.end();
for(int i = 0; i < length; ++i)
{
it = mp.find(target - numbers[i]);
if(it != mp.end())
{
res.push_back(min(i+1,it->second +1));
res.push_back(max(i+1,it->second +1));
break;
}
}
return res;
}
//思路4
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> res;
int length = numbers.size();
map<int,int> mp;
int find;
for(int i = 0; i < length; ++i){
find=mp[target - numbers[i]];
if(find){
res.push_back(find);
res.push_back(i+1);
break;
}
mp[numbers[i]] = i+1;
}
return res;
}
- 总结:第一次上LeetCoder做题,还不是很习惯这种写法,上去就CE了,hashmap比用数组来模拟更省空间,优化的方法很好。