113 lines
2.4 KiB
Markdown
113 lines
2.4 KiB
Markdown
# Leetcode Two Sum
|
||
|
||
#### 2022-06-10
|
||
|
||
---
|
||
##### Data structures:
|
||
#DS #array #map #unordered_map
|
||
##### Algorithms:
|
||
#algorithm
|
||
##### Difficulty:
|
||
#coding_problem #leetcode #difficulty-easy
|
||
##### Related topics:
|
||
```expander
|
||
tag:#map OR tag:#unordered_map
|
||
```
|
||
|
||
- [[cpp_std_unordered_map]]
|
||
- [[Leetcode Intersection-of-Two-Arrays-II]]
|
||
|
||
|
||
##### Links:
|
||
- [Link to problem](https://leetcode.com/problems/two-sum)
|
||
- [O(n) Solution](https://leetcode.com/problems/two-sum/discuss/13/Accepted-C++-O(n)-Solution/263)
|
||
|
||
___
|
||
### Problem
|
||
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.
|
||
|
||
#### Examples
|
||
|
||
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]
|
||
```
|
||
|
||
#### Constraints
|
||
|
||
- `2 <= nums.length <= 104`
|
||
- `-109 <= nums[i] <= 109`
|
||
- `-109 <= target <= 109`
|
||
- **Only one valid answer exists.**
|
||
|
||
### Thoughts
|
||
|
||
Firstly, I think up an easy O(n^2) solution, by using a nested loop,
|
||
But the best solution utilizes an __[[cpp_std_unordered_map]]__.
|
||
|
||
> [!tips]
|
||
> Use **[[cpp_std_unordered_map | unordered map]]** to create a hash table, it has O(1) in search, delete and insert. #tip
|
||
|
||
### Solution
|
||
|
||
O(n^2) solution
|
||
```cpp
|
||
class Solution {
|
||
public:
|
||
vector<int> twoSum(vector<int>& nums, int target) {
|
||
vector<int> pair;
|
||
for (int i = 0; i < nums.size(); i++) {
|
||
for (int j = i + 1; j < nums.size(); j++) {
|
||
if (nums[i] + nums[j] == target) {
|
||
pair.insert(pair.begin(), i);
|
||
pair.insert(pair.begin(), j);
|
||
return pair;
|
||
}
|
||
}
|
||
}
|
||
return pair;
|
||
}
|
||
};
|
||
```
|
||
|
||
O(n) solution
|
||
```cpp
|
||
class Solution {
|
||
public:
|
||
vector<int> twoSum(vector<int>& nums, int target) {
|
||
// use unordered_map here.
|
||
unordered_map<int, int> umap;
|
||
for (int i = 0; i < nums.size(); i++) {
|
||
auto search = umap.find(target - nums[i]);
|
||
if ( search != umap.end()) {
|
||
return vector<int> {i, search->second};
|
||
}
|
||
|
||
umap[nums[i]] = i;
|
||
}
|
||
return vector<int> {0, 0};
|
||
}
|
||
};
|
||
```
|