您的位置:首页 > 其它

Two Sum

2015-09-07 16:45 225 查看

题目1:Two Sum

题目描述:

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9

Output: index1=1, index2=2

题目分析:

在一个无序数组中找到和等于target的两个数,并返回两个数的下标,要求index1小于index2。

思路分析:

如果是返回这两个数的值,则排序再从头和尾开始遍历找到和等于target的两个数就可以了。题目要求返回两个数的下标,所以稍微繁琐。先用c++实现。

过程是用map来保存数组值和下标nums[i]和index,如代码所示:

vector<int> TwoSum(vector<int> &nums, int target) {
map<int, int> mp;
map<int, int>::iterator iter;
vector<int> res;
int i;
for (i = 0; i < nums.size(); i ++)
mp.insert(make_pair(nums[i], i + 1));
for (i = 0; i < nums.size(); i ++) {
iter = mp.find(target - nums[i]);
if (iter != mp.end()) {
res.push_back(i + 1);
res.push_back(iter->second);
return res;
}
}
/* 题目给的target总有一个solution */
}


error1:出现是同一个数时,[3, 2, 4],target是6,添加判断

if (iter != mp.end() && iter->second != i+1)

error2:map保存的是不同的元素,相同的输入元素忽略,[0, 1, 2, 0],target是0时,返回11,正确是返回14。

error3:改为multimap,multimap不支持根据键作为数组下标的访问,map支持,find时是找到的第一个就返回,还是不能找到最后的0返回。

C++map:

1. map是STL容器中关联容器的一种,C++中关联容器主要有set、multiset、map、multimap。

2. 关联容器与顺序容器(vector、list、deque双端队列)不同,关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素师按它们在容器中的位置来顺序保存和访问的。

3. map中添加键值对,map.insert(make_pair(key, value));map/multimap映射的元素是由<键,值>对构成,且同一个键可对应多个不同的值,可以通过迭代器访问它们的元素,map支持用键作为数组下标,访问该键对应的值,但multimap不支持。

较挫的code:

vector<int> twoSum(vector<int>& nums, int target) {
multimap<int, int> mp;
multimap<int, int>::iterator iter;
vector<int> res;
int i;
for (i = 0; i < nums.size(); i ++) {
mp.insert(make_pair(nums[i], i + 1));
}
for (i = 0; i < nums.size(); i ++) {
iter = mp.find(target - nums[i]);
if (iter != mp.end() && iter->second != i + 1) {
if (i + 1 > iter->second) {
res.push_back(iter->second);
res.push_back(i + 1);
} else {
res.push_back(i + 1);
res.push_back(iter->second);
}
return res;
}
}
}


better code:

class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> mp;
map<int, int>::iterator pt;
vector<int> ans;
for (int i = 0; i < nums.size(); i++) {
pt = mp.find(target - nums[i]);
/* 只要是找到下标一定是小的,因为是在前面添加的 */
if (pt != mp.end()) {
ans.push_back(pt->second);
ans.push_back(i + 1);
return ans;
}
pt = mp.find(nums[i]);
if (pt == mp.end()) {
mp[ nums[i] ] = i + 1;
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  twosum