LeetCodeAnimation/notes/LeetCode第1号问题:两数之和.md
2019-05-03 17:47:30 +08:00

68 lines
2.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LeetCode 1 号问题两数之和
> 本文首发于公众号五分钟学算法[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
>
> 视频讲解[跟着程序员小吴图解 LeetCode LeetCode 1 号问题两数之和](<https://www.bilibili.com/video/av51296602>)
题目来源于 LeetCode 上第 1 号问题两数之和题目难度为 Easy目前通过率为 45.8%
### 题目描述
给定一个整数数组 `nums` 和一个目标值 `target`请你在该数组中找出和为目标值的那 **两个** 整数并返回他们的数组下标
你可以假设每种输入只会对应一个答案但是你不能重复利用这个数组中同样的元素
**示例:**
```
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
```
### 题目解析
使用查找表来解决该问题
设置一个 map 容器 record 用来记录元素的值与索引然后遍历数组 nums
* 每次遍历时使用临时变量 complement 用来保存目标值与当前值的差值
* 在此次遍历中查找 record 查看是否有与 complement 一致的值如果查找成功则返回查找值的索引值与当前变量的值 i
* 如果未找到则在 record 保存该元素与索引值 i
### 动画描述
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/20181028221055.gif)
### 代码实现
```
// 1. Two Sum
// https://leetcode.com/problems/two-sum/description/
// 时间复杂度O(n)
// 空间复杂度O(n)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> record;
for(int i = 0 ; i < nums.size() ; i ++){
int complement = target - nums[i];
if(record.find(complement) != record.end()){
int res[] = {i, record[complement]};
return vector<int>(res, res + 2);
}
record[nums[i]] = i;
}
}
};
```
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/blog/fz0rq.png)