Skip to content

Commit 9bccd66

Browse files
committed
feat: 更新题解1.两数之和
1 parent c926603 commit 9bccd66

File tree

4 files changed

+173
-186
lines changed

4 files changed

+173
-186
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@
111111

112112
### 哈希表
113113

114-
- [x] [【day-19】1.两数之和](./basic/day-19.md)
114+
- [x] [【day-19】1.两数之和](./basic/hashmap/19.two-sum.md)
115115
- [x] [【day-20】447.回旋镖的数量](./basic/day-20.md)
116116
- [ ] 【day-21】36.有效的数独
117117
- [x] [【day-22】645.错误的集合](./basic/day-22.md)

basic/day-18.md

Lines changed: 0 additions & 41 deletions
This file was deleted.

basic/day-19.md

Lines changed: 0 additions & 144 deletions
This file was deleted.

basic/hashmap/19.two-sum.md

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
# 1. 两数之和
2+
3+
https://leetcode-cn.com/problems/two-sum
4+
5+
- [1. 两数之和](#1-两数之和)
6+
- [题目描述](#题目描述)
7+
- [方法 1:哈希表](#方法-1哈希表)
8+
- [思路](#思路)
9+
- [复杂度分析](#复杂度分析)
10+
- [代码](#代码)
11+
- [方法 2:排序+双指针](#方法-2排序双指针)
12+
- [思路](#思路-1)
13+
- [复杂度分析](#复杂度分析-1)
14+
- [代码](#代码-1)
15+
- [方法 3:暴力法](#方法-3暴力法)
16+
- [思路](#思路-2)
17+
- [复杂度分析](#复杂度分析-2)
18+
- [代码](#代码-2)
19+
20+
## 题目描述
21+
22+
```
23+
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
24+
25+
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
26+
27+
28+
29+
示例:
30+
31+
给定 nums = [2, 7, 11, 15], target = 9
32+
33+
因为 nums[0] + nums[1] = 2 + 7 = 9
34+
所以返回 [0, 1]
35+
36+
来源:力扣(LeetCode)
37+
链接:https://leetcode-cn.com/problems/two-sum
38+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
39+
```
40+
41+
## 方法 1:哈希表
42+
43+
### 思路
44+
45+
在遍历数组的同时把数字和下标存进哈希表中,然后看 `目标值 - 当前数字` 是否存在于哈希表中,有的话直接返回结果,没有就继续遍历。
46+
47+
由于不能使用同一个元素,要注意先检查,再将当前数字加入哈希表。
48+
49+
### 复杂度分析
50+
51+
- 时间复杂度:$O(N)$,N 为数组长度,最坏的情况下数组中的每个元素都被访问一次,访问数组元素的时间是 $O(1)$,哈希表插入和查询元素的时间也是 $O(1)$。
52+
- 空间复杂度:$O(N)$,N 为数组长度,用来存元素和下标的哈希表所需的空间。
53+
54+
### 代码
55+
56+
JavaScript Code
57+
58+
```js
59+
/**
60+
* @param {number[]} nums
61+
* @param {number} target
62+
* @return {number[]}
63+
*/
64+
var twoSum = function (nums, target) {
65+
if (!nums || !nums.length) return [];
66+
67+
const map = {};
68+
for (let i = 0; i < nums.length; i++) {
69+
const num = nums[i];
70+
const diff = target - num;
71+
72+
if (diff in map) return [map[diff], i];
73+
map[num] = i;
74+
}
75+
};
76+
```
77+
78+
Python Code
79+
80+
```py
81+
class Solution(object):
82+
def twoSum(self, nums, target):
83+
"""
84+
:type nums: List[int]
85+
:type target: int
86+
:rtype: List[int]
87+
"""
88+
hashmap = {}
89+
for i, n in enumerate(nums):
90+
diff = target - n
91+
if diff in hashmap:
92+
return [hashmap[diff], i]
93+
hashmap[n] = i
94+
```
95+
96+
## 方法 2:排序+双指针
97+
98+
### 思路
99+
100+
- 先给数组排序,再用双指针查找。
101+
- 不过题目要求返回下标,所以排序之前还需要保存原本的下标。
102+
103+
### 复杂度分析
104+
105+
- 时间复杂度:$O(NlogN)$,N 为数组长度。
106+
- 空间复杂度:$O(1)$。(不是很确定,是 $O(1)$ 还是 $O(N)$)
107+
108+
### 代码
109+
110+
JavaScript Code
111+
112+
```js
113+
/**
114+
* @param {number[]} nums
115+
* @param {number} target
116+
* @return {number[]}
117+
*/
118+
var twoSum = function (nums, target) {
119+
if (!nums || !nums.length) return [];
120+
121+
// 保存原来的下标,然后升序排序,nums 中元素的格式是 [num, index]
122+
// [2,7,11,15] => [[2, 0], [7, 1], [11, 2], [15, 3]]
123+
nums = nums.map((n, i) => [n, i]);
124+
nums.sort((a, b) => a[0] - b[0]);
125+
126+
let l = 0,
127+
r = nums.length - 1;
128+
while (l < r) {
129+
const n1 = nums[l][0],
130+
n2 = nums[r][0];
131+
132+
if (n1 + n2 === target) return [nums[l][1], nums[r][1]];
133+
134+
// 太大了,右指针左移
135+
if (n1 + n2 > target) r--;
136+
// 太小了,左指针右移
137+
else l++;
138+
}
139+
};
140+
```
141+
142+
## 方法 3:暴力法
143+
144+
### 思路
145+
146+
暴力法也顺便做一下吧。
147+
148+
### 复杂度分析
149+
150+
- 时间复杂度:$O(N^2)$,N 为数组长度。
151+
- 空间复杂度:$O(1)$。
152+
153+
### 代码
154+
155+
JavaScript Code
156+
157+
```js
158+
/**
159+
* @param {number[]} nums
160+
* @param {number} target
161+
* @return {number[]}
162+
*/
163+
var twoSum = function (nums, target) {
164+
if (!nums || !nums.length) return [];
165+
166+
for (let i = 0; i < nums.length; i++) {
167+
for (let j = i + 1; j < nums.length; j++) {
168+
if (nums[i] + nums[j] === target) return [i, j];
169+
}
170+
}
171+
};
172+
```

0 commit comments

Comments
 (0)