LeetCode 1. Two Sum 解题报告
题目描述
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
示例
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
限制条件
没有明确给出。
解题思路
我的思路:
最简单的方式当然就是暴力破解,直接用两个for循环就可以搞定。
这种方式太粗暴了一些,所以还是想其它更为优雅的方式。记得之前做了这道题的一个变种题LeetCode 167.Two Sum II。167题中给出的数组是有序的,直接用双指针的方法就能找到对应的两个数的下标。可以把该题的思路用到这里,分成三步进行:
1.拷贝一份数组,并对数组副本进行排序
2.在数组副本中利用双指针的方法得到和等于目标的两个数
3.在原来的数组中寻找这两个数的索引并返回
参考思路:
题目中的数值及索引构成了一个对应关系(value, index),所以可以考虑用multimap结构存储这些对应关系。
遍历数组,对于每一个元素
num[i]
,都可以先求出
target−num[i]
,判断
(target−num[i],index)
是否在multimap中,如果存在,则表明找到了和为
target
的两个数,并且它们的坐标分别是
(target−num[i],index)
中的
index
和
i
。如果不存在,则把
由于和是有两个数相加,所以第一个数肯定会被插入到multimap中,当遍历到第二个数时就会满足判断条件从而得到结果。
代码
我的代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> indexes;
vector<int> numsCopy(nums);
int left = 0;
int right = numsCopy.size() - 1;
sort(numsCopy.begin(), numsCopy.end());
while(left < right) {
int sum = numsCopy[left] + numsCopy[right];
if (sum == target) {
break;
} else if (sum > target) {
right--;
} else {
left++;
}
}
for (int i = 0; i < nums.size(); i++) {
if(nums[i] == numsCopy[left]) {
indexes.push_back(i);
continue;
}
if(nums[i] == numsCopy[right]) {
indexes.push_back(i);
continue;
}
}
return indexes;
}
};
参考代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> indexes;
multimap<int, int> mMap;
for (int i = 0; i < nums.size(); i++) {
int component = target - nums[i];
multimap<int, int>::iterator itr = mMap.find(component);
if (itr != mMap.end()) {
indexes.push_back(itr->second);
indexes.push_back(i);
break;
}
mMap.insert(pair<int, int>(nums[i], i));
}
return indexes;
}
};
总结
这道题给出的tag是hash table,所以我通过之后就去找了哈希表的资料看看,感觉还没有怎么深刻去理解哈希表,所以还是靠做哈希表相关的题加深一下理解吧。
闲着没事就多填坑,少打游戏,加油!