---
# System prepended metadata

title: leetCode EASY - Q1  -Two Sum
tags: [練習刷題, '219', leetCode]

---

leetCode EASY - Q1 - Two Sum  
===
![](https://s2.51cto.com/images/blog/202108/03/d41ce0d2323853fe7d9868daf22eac2f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/format,webp)


---
###### tags: `leetCode`, `練習刷題`, `219`

<br>

## 題目

Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

You can return the answer in any order.

Example 1:

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].
Example 2:

Input: nums = [3,2,4], target = 6
Output: [1,2]
Example 3:

Input: nums = [3,3], target = 6
Output: [0,1]

## 講解：

這是刷題的入門第一題，簡單地解釋就是如果裡面value相加然後跟target一樣的話，就放入新的array裡面，顯示之前他們的key作為答案。

## 我的解法：

```
function twoSum（nums, target）{
    const seen ={};
    for(let i=0; i < nums.length; i++){
        const complement = target - nums[i];
        if(complement in seen){
            return [seen[complement], i];
        }
        seen[nums[i]] = i;
    }
    return [];
}

--------------------------------------------

function twoSum(nums, target){
    let numMap = new Map();
    
    for(let i= 0; i<nums.length; i++){
        let complement = target - nums[i];
        
        if(numMap.has(complement)){
            return [numMap.get(complement), i];
        }
        numMap.set(nums[i], i);
    }
    return [];
}
```

今天輸入為：nums = [2, 7, 11, 15] 和 target = 9
1. 我們創建 seen 用來儲存已經遍歷過的數字和index。
2. 因為target是結果，我們用i作為第一個對象，然後用 complement 來尋找另一個對象。
---
接下來,我們開始遍歷 nums 數組:

### 第一次循環:
**i = 0，nums[i] = 2**
計算 complement = target - nums[i] = 9 - 2 = 7
complement 不在 seen 對象中,所以我們將 nums[i] = 2 和 i = 0 存入 seen 對象中。
**seen = { 2: 0 }**
返回 []，因為還沒有找到滿足條件的數對。

### 第二次循環:
**i = 1，nums[i] = 7**
計算 complement = target - nums[i] = 9 - 7 = 2
seen 對象中有 2，所以我們返回 [seen[2], i] = [0, 1]。
最終結果是 [0, 1]。

每次循環時，我們都會計算當前元素 *nums[i]* 所需的補數 *complement* 。如果 *complement* 已經存在於 seen 對象中，說明我們找到了一堆滿足條件的數字，我們就返回他們的index，否則，我們將當前元素 *nums[i]* 和它的index i 存入 seen 對象裡。

---

## 別人最佳解法：

```
var twoSum = function(nums, target) {

const obj = {}
    for(let i = 0; i < nums.length; i++){
        const diff = target - nums[i];
        if(obj[diff] !== undefined){
            return [i, obj[diff] ]
        }
        obj[nums[i]] = i;
    }
};
```

1. 首先我們建立一個obj 空對象，用於存儲已經遍歷過的元素及 index
2. 然後我們開始遍歷輸入數組 nums ，對於每個元素 nums[i]:
    a. 我們計算目標值 target 與當前元素 nums[i] 的差值diff。
    b. 我們檢查 obj 對象中是否存在 diff 這個屬性：
                - 如果存在說明我們找到了一堆滿足條件數字，我們立即返回 [i, obj[diff]], 其中 i 當前元素的 index， obj[diff] 是之前遇到的與當前元素之和等於 target 的元素index。
                - 如果不存在，我們將當前元素 nums[i] 及 index 存入 obj裡面。
                
---

假設輸入是 **nums = [2, 7, 11, 15]** 和 **target = 9**。

### 第一次循環:

**i = 0，nums[i] = 2**
**diff = target - nums[i] = 9 - 2 = 7**
obj 對象中不存在 7 這個屬性
我們將 2 和 0 存入 obj 對象中，obj = { 2: 0 }
返回 []

### 第二次循環:

**i = 1，nums[i] = 7**
**diff = target - nums[i] = 9 - 7 = 2**
obj 對象中存在 2 這個屬性，其值是 0
我們返回 [1, 0]
最終結果是 **[1, 0]**
    


