# LeetCode 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

#### 题目分析

##### 思路：

1. 首先将数组的数插入到map中，同时map的key为数组的值，而value等于数组的下标

2. 从map开始遍历，从target减去当前的iter->first 即value1，这里first是键也是原来numbers数组中的值

3. 得到另一个值value2，查看map中是否存在该键，若存在看value1+value2是否等于target

4. 若等于target判断，是否为target的二分之一，因为会出现相同的值，若target为一个value值的两倍，从数组充查找是否存在有两个value,若存在则加入reslut

5. 若不是，则从map中直接取出键所对应的值，按小的在前的顺序放入result,因为map中“值”存放的是实际数组的下标，“键”存放的是实际数组中的值。最后输出result即可。

``````#include<iostream>
#include<vector>
#include<map>
#include<math.h>
#include<algorithm>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> result;
map<int,int> nummap;
map<int,int>::iterator i;
for(int i = 0 ;i < numbers.size(); i++)
nummap.insert(make_pair(numbers[i],i+1));//map中key存放numbers数组的值，value存放下标
for(map<int ,int >::iterator iter = nummap.begin(); iter!= nummap.end(); iter++)
{
int value1 = iter->first;
int value2 = target - value1;
i = nummap.find(value2);
if( i != nummap.end())
{
if(value1 + value2 == target)
{
if(value1 == value2)//看找到的值是否为target的二分之一，若是二分之一，必须存在2个才符合要求
{
vector<int>::iterator j;
vector<int>::iterator k = find (numbers.begin(), numbers.end(), value1);
if(k!= numbers.end())//看是否存在两个
{
j = find(k+1, numbers.end(), value1);
if(j!= numbers.end())
{
result.push_back(k-numbers.begin()+1);
result.push_back(j-numbers.begin()+1);
return result;
}
}
}
else//若不是二分之一，说明存在两个不同下标的不同值相加为target，从map中取出他们相应的索引
{
result.push_back(min(nummap[value1],nummap[value2]));
result.push_back(max(nummap[value1],nummap[value2]));
return result;
}

}
}
}
return result;
}
};

int main ()
{
Solution s1;
int num[] ={0, 2, 4, 0};
vector<int> numbers (num,num+4);
int target = 0;
vector<int> result = s1.twoSum(numbers, target);
for(int i = 0 ;i < result.size(); i++)
{
cout<< result[i]<<endl;
}
return 0;
}
``````

## LeetCode 1 Two Sum 解题报告的更多相关文章

1. LeetCode: Minimum Path Sum 解题报告

Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...

2. LeetCode 2 Add Two Sum 解题报告

LeetCode 2 Add Two Sum 解题报告 LeetCode第二题 Add Two Sum 首先我们看题目要求: You are given two linked lists repres ...

3. 【LeetCode】Permutations II 解题报告

[题目] Given a collection of numbers that might contain duplicates, return all possible unique permuta ...

4. LeetCode: Combination Sum 解题报告

Combination Sum Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Questi ...

5. LeetCode: Unique Paths II 解题报告

Unique Paths II Total Accepted: 31019 Total Submissions: 110866My Submissions Question Solution  Fol ...

6. 【LeetCode】3Sum Closest 解题报告

[题目] Given an array S of n integers, find three integers in S such that the sum is closest to a give ...

7. USACO Section2.3 Zero Sum 解题报告 【icedream61】

zerosum解题报告----------------------------------------------------------------------------------------- ...

8. Leetcode 115 Distinct Subsequences 解题报告

Distinct Subsequences Total Accepted: 38466 Total Submissions: 143567My Submissions Question Solutio ...

9. LeetCode 1013 Partition Array Into Three Parts With Equal Sum 解题报告

题目要求 Given an array A of integers, return true if and only if we can partition the array into three  ...

## 随机推荐

1. 【linux草鞋应用编程系列】_1_ 开篇_系统调用IO接口与标准IO接口

最近学习linux系统下的应用编程,参考书籍是那本称为神书的<Unix环境高级编程>,个人感觉神书不是写给草鞋看的,而是 写给大神看的,如果没有一定的基础那么看这本书可能会感到有些头重脚轻 ...

2. BZOJ 3110 [Zjoi2013]K大数查询

Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

3. 修改eclipse/MyEclipse中包的显示结构为树形

在右上边三角那里进去设置 选第一个是显示完整的包名,第二个显示的是树形结构,我们一般用第一种,如下图:

4. UVALive6571 It Can Be Arranged(最小路径覆盖)

题意:现在有n个课程,每个课程有一定的参与人数,然后每个课程有开始时间和结束时间ai,bi. 而且给定了一个矩阵clean(ij),表示的是上完i课程需要clean[i][j]的时间打扫卫生才能继续上 ...

5. 李洪强iOS经典面试题12

1.说说响应链 答: 事件响应链.包括点击事件,画面刷新事件等.在视图栈内从上至下,或者从下之上传播. 可以说点事件的分发,传递以及处理.具体可以去看下touch事件这块.因为问的太抽象化了 严重怀 ...

6. mongoDB 查询附近的人的语句

mongoDB 自带LBS查询附近的人 {"location":{ \$nearSphere: { \$geometry: { type : "Point", co ...

7. Flex自定义组件开发之日周月日期选择日历控件

原文:Flex自定义组件开发之日周月日期选择日历控件         使用过DateField的我们都知道,DateField 控件是用于显示日期的文本字段,字段右侧带有日历图标.当用户在控件边框内的 ...

8. CSS3美化网页元素

<span>标签 </span>属性名 含义 举例font-family 设置字体类型 font-family:"隶书"font-size 设置字体大小 f ...

9. 前端入门7-JavaScript语法之相关术语

声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...

10. Redis cluster集群模式的原理

redis cluster redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求 自动将数据进行分片,每个master上放一部分数据 提供内 ...