# LeetCode - 1. Two Sum
###### tags: `LeetCode` `Guide` `C++` `Easy`
> 原題連結: https://leetcode.com/problems/two-sum/
> Difficulty: <span style="color: green;">Easy</span>
## 題目說明
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, and you may not use the same element twice.
## 範例測資
### Example 1.
#### Input:
> Given nums = [2, 7, 11, 15], target = 9,
#### Output:
> [0, 1].
#### Explanation:
> Because nums[0] + nums[1] = 2 + 7 = 9, so return [0, 1].
## 說明
身為整個題庫的第一題,這題就是小case啦。
題目會指定一個數字target,要在array中找到2個數,加起來正好等於target,並回傳他們的索引值。
## Code與解析
### 做法1. Brute Force <span style="font-size:5px; color:green;">[Accept]</span>
> Runtime: 260 ms > faster than 9.90%
> Memory: 9.1 MB > less than 99.73%
```cpp=
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){
for(int j = 0; j < nums.size(); j++){
if(i != j && nums[i] + nums[j] == target) return {i, j};
}
}
return {};
}
};
```
簡單利用兩層的迴圈,把整個array中的值兩兩配對過一遍,直到找到符合的項目為止。
因為測資不挑,所以即使是效率較差的暴力法也能AC。
### 做法2. One-pass Hash <span style="font-size:5px; color:green;">[Accept]</span>
> Runtime: 8 ms > faster than 92.99%
> Memory: 10.1 MB > less than 50.95%
```cpp=
class Solution {
private:
map<int, int> index;
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){
if(index.find(target - nums[i]) == index.end()){
index[nums[i]] = i;
}
else{
return {index[target - nums[i]], i};
}
}
return {-1, -1};
}
};
```
這個做法也不難,而且因為只要讀過一次array,所需時間不會太多。
做法是在讀取的同時,把"哪個數字在哪裡出現過"這件事給記下來,這樣之後需要的時候就不必再遍歷一次,直接到對應的index找就好了。
舉例來說,若題目為:
> Array: [2, 15, 7, 1]
> Target: 9
第一個會讀到的是2,那因為沒有先前的數字,所以理所當然的找不到9-2=7的對應值。
那這時我們就會把"2出現在index=0"這件事給記下來:
```cpp
map<int, int> index;
index[2] = 0;
```
第二個會讀到的是15,同樣的,我們沒有找到9-15=-7的對應值,所以也要把15記下來:
```cpp
index[15] = 1;
```
下一個會讀到7,這次我們會發現9-7=2已經被記錄過了,所以存取index[2],就能得到我們要的答案了。