Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 31bca7d

Browse files
committed
更新题解列表
1 parent 213a58e commit 31bca7d

6 files changed

+186
-31
lines changed

‎Solutions/0034. 在排序数组中查找元素的第一个和最后一个位置.md

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,34 @@
55

66
## 题目大意
77

8-
给定一个升序数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。要求使用时间复杂度为 $O(log n)$ 的算法解决问题。
8+
**描述**:给你一个按照非递减顺序排列的整数数组 `nums`,和一个目标值 `target`
9+
10+
**要求**:找出给定目标值在数组中的开始位置和结束位置。
11+
12+
**说明**:
13+
14+
- 要求使用时间复杂度为 $O(\log n)$ 的算法解决问题。
15+
16+
**示例**:
17+
18+
```Python
19+
输入:nums = [5,7,7,8,8,10], target = 8
20+
输出:[3,4]
21+
22+
23+
输入:nums = [5,7,7,8,8,10], target = 6
24+
输出:[-1,-1]
25+
```
926

1027
## 解题思路
1128

12-
要求使用时间复杂度为 $O(logn)$ 的算法解决问题,那么就需要使用「二分查找算法」了。这道题明显就是对「二分查找」的考察。
29+
### 思路 1:二分查找
1330

14-
进行两次二分查找,第一次尽量向左搜索。第二次尽量向右搜索
31+
要求使用时间复杂度为 $O(\log n)$ 的算法解决问题,那么就需要使用「二分查找算法」了
1532

16-
## 代码
33+
- 进行两次二分查找,第一次尽量向左搜索。第二次尽量向右搜索。
34+
35+
### 思路 1:代码
1736

1837
```Python
1938
class Solution:
@@ -52,3 +71,7 @@ class Solution:
5271
return ans
5372
```
5473

74+
### 思路 1:复杂度分析
75+
76+
- **时间复杂度**:$O(\log_2 n)$。
77+
- **空间复杂度**:$O(1)$。

‎Solutions/0056. 合并区间.md

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,42 @@
55

66
## 题目大意
77

8-
数组 intervals 表示若干个区间的集合。请合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需要恰好覆盖原数组中的所有区间。
8+
**描述**:给定数组 `intervals` 表示若干个区间的集合,其中单个区间为 `intervals[i] = [starti, endi]`
9+
10+
**要求**:合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
11+
12+
**说明**:
13+
14+
- 1ドル \le intervals.length \le 10^4$。
15+
- $intervals[i].length == 2$。
16+
- 0ドル \le starti \le endi \le 10^4$。
17+
18+
**示例**:
19+
20+
```Python
21+
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
22+
输出:[[1,6],[8,10],[15,18]]
23+
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
24+
25+
26+
输入:intervals = [[1,4],[4,5]]
27+
输出:[[1,5]]
28+
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
29+
```
930

1031
## 解题思路
1132

12-
设定一个数组 ans 用于表示最终不重叠的区间数组,然后对原始区间先按照区间左端点大小从小到大进行排序。
33+
### 思路 1:排序
1334

14-
遍历所有区间。先将第一个区间加入 ans 数组中。然后依次考虑后边的区间,如果第 i 个区间左端点在前一个区间右端点右侧,则这两个区间不会重合,直接将该区间加入 ans 数组中。否则的话,这两个区间重合,判断一下两个区间的右区间值,更新前一个区间的右区间值为较大值,然后继续考虑下一个区间,以此类推。
35+
1. 设定一个数组 `ans` 用于表示最终不重叠的区间数组,然后对原始区间先按照区间左端点大小从小到大进行排序。
36+
2. 遍历所有区间。
37+
3. 先将第一个区间加入 `ans` 数组中。
38+
4. 然后依次考虑后边的区间:
39+
1. 如果第 `i` 个区间左端点在前一个区间右端点右侧,则这两个区间不会重合,直接将该区间加入 `ans` 数组中。
40+
2. 否则的话,这两个区间重合,判断一下两个区间的右区间值,更新前一个区间的右区间值为较大值,然后继续考虑下一个区间,以此类推。
41+
5. 最后返回数组 `ans`
1542

16-
##代码
43+
### 思路 1:代码
1744

1845
```Python
1946
class Solution:
@@ -29,3 +56,8 @@ class Solution:
2956
return ans
3057
```
3158

59+
### 思路 1:复杂度分析
60+
61+
- **时间复杂度**:$O(n \times \log_2 n)$。其中 $n$ 为区间数量。
62+
- **空间复杂度**:$O(n)$。
63+

‎Solutions/0088. 合并两个有序数组.md

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,43 @@
55

66
## 题目大意
77

8-
给定两个有序数组 `nums1``nums2`。将 `nums2` 合并到 `nums1` 中,使 `nums1` 成为一个有序数组
8+
**描述**:给定两个有序数组 `nums1``nums2`
99

10-
其中给定数组 nums1 空间大小为 m + n 个,其中前 m 个为 nums1 的元素。`nums2` 空间大小为 n。这样可以用 `nums1` 的空间来存储最终的有序数组。
10+
**要求**:将 `nums2` 合并到 `nums1` 中,使 `nums1` 成为一个有序数组。
11+
12+
**说明**:
13+
14+
- 给定数组 `nums1` 空间大小为` m + n` 个,其中前 `m` 个为 `nums1` 的元素。`nums2` 空间大小为 `n`。这样可以用 `nums1` 的空间来存储最终的有序数组。
15+
- $nums1.length == m + n$。
16+
- $nums2.length == n$。
17+
- 0ドル \le m, n \le 200$。
18+
- 1ドル \le m + n \le 200$。
19+
- $-10^9 \le nums1[i], nums2[j] \le 10^9$。
20+
21+
**示例**:
22+
23+
```Python
24+
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
25+
输出:[1,2,2,3,5,6]
26+
解释:需要合并 [1,2,3] 和 [2,5,6] 。
27+
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
28+
29+
30+
输入:nums1 = [1], m = 1, nums2 = [], n = 0
31+
输出:[1]
32+
解释:需要合并 [1] 和 [] 。
33+
合并结果是 [1] 。
34+
```
1135

1236
## 解题思路
1337

14-
将两个指针 index1、index2 分别指向 nums1、nums2 元素的尾部,再用一个指针 index 指向数组 nums1 的尾部。从后向前判断当前指针下 nums1[index1] 和 nums[index2] 的值大小,将较大值存入 num1[index] 中,然后继续向前遍历。最后再将 nums 中剩余元素赋值到 num1 前面对应位置上。
38+
### 思路 1:快慢指针
1539

16-
## 代码
40+
1. 将两个指针 `index1``index2` 分别指向 `nums1``nums2` 数组的尾部,再用一个指针 `index` 指向数组 `nums1` 的尾部。
41+
2. 从后向前判断当前指针下 `nums1[index1]``nums[index2]` 的值大小,将较大值存入 `num1[index]` 中,然后继续向前遍历。
42+
3. 最后再将 `nums2` 中剩余元素赋值到 `num1` 前面对应位置上。
43+
44+
### 思路 1:代码
1745

1846
```Python
1947
class Solution:
@@ -33,3 +61,7 @@ class Solution:
3361
nums1[:index2+1] = nums2[:index2+1]
3462
```
3563

64+
### 思路 1:复杂度分析
65+
66+
- **时间复杂度**:$O(m + n)$。
67+
- **空间复杂度**:$O(m + n)$。

‎Solutions/0136. 只出现一次的数字.md

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,42 @@
55

66
## 题目大意
77

8-
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。要求不能使用额外的存储空间。
8+
**描述**:给定一个非空整数数组 `nums`,`nums` 中除了某个元素只出现一次以外,其余每个元素均出现两次。
9+
10+
**要求**:找出那个只出现了一次的元素。
11+
12+
**说明**:
13+
14+
- 要求不能使用额外的存储空间。
15+
16+
**示例**:
17+
18+
```Python
19+
输入: [2,2,1]
20+
输出: 1
21+
22+
23+
输入: [4,1,2,1,2]
24+
输出: 4
25+
```
926

1027
## 解题思路
1128

12-
如果没有时间复杂度和空间复杂度的限制,可以使用字典来存储每个元素出现的次数,或者用集合来存储数字,如果集合中没有该数字,则将该数字加入集合,如果集合中有了该数字,则从集合中删除该数字,最终成对的数字都被删除了,只剩下单次出现的元素。
29+
### 思路 1:位运算
1330

14-
如果考虑不使用额外的存储空间,就需要用到位运算中的异或运算。对 n 个数不断进行异或操作,最终可得到单次出现的元素
31+
如果没有时间复杂度和空间复杂度的限制,可以使用哈希表 / 集合来存储每个元素出现的次数,如果哈希表中没有该数字,则将该数字加入集合,如果集合中有了该数字,则从集合中删除该数字,最终成对的数字都被删除了,只剩下单次出现的元素
1532

16-
> 异或运算 ⊕ 的三个性质:
33+
但是题目要求不使用额外的存储空间,就需要用到位运算中的异或运算。
34+
35+
> 异或运算 $\oplus$ 的三个性质:
1736
>
18-
> 1. 任何数和 0 做异或运算,结果仍然是原来的数,即 a ⊕ 0 = a。
19-
> 2. 数和其自身做异或运算,结果是 0,即 a ⊕ a = 0。
20-
> 3. 异或运算满足交换率和结合律:a ⊕ b ⊕ a = b ⊕ a ⊕ a = b ⊕ (a ⊕ a) = b ⊕ 0 = b。
37+
> 1. 任何数和 0ドル$ 做异或运算,结果仍然是原来的数,即 $a \oplus 0 = a$。
38+
> 2. 数和其自身做异或运算,结果是 0ドル,ドル即 $a \oplus a = 0$。
39+
> 3. 异或运算满足交换率和结合律:$a \oplus b \oplus a = b \oplus a \oplus a = b \oplus (a \oplus a) = b \oplus 0 = b$。
40+
41+
根据异或运算的性质,对 $n$ 个数不断进行异或操作,最终可得到单次出现的元素。
2142

22-
##代码
43+
### 思路 1:代码
2344

2445
```Python
2546
class Solution:
@@ -32,3 +53,7 @@ class Solution:
3253
return ans
3354
```
3455

56+
### 思路 1:复杂度分析
57+
58+
- **时间复杂度**:$O(n)$。
59+
- **空间复杂度**:$O(1)$。

‎Solutions/0169. 多数元素.md

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,36 @@
55

66
## 题目大意
77

8-
给定一个数组,找到其中相同元素个数最多的元素
8+
**描述**:给定一个大小为 $n$ 的数组 `nums`
99

10-
## 解题思路
10+
**要求**:返回其中相同元素个数最多的元素。
11+
12+
**说明**:
13+
14+
- $n == nums.length$。
15+
- 1ドル \le n \le 5 * 10^4$。
16+
- $-10^9 \le nums[i] \le 10^9$。
17+
18+
**示例**:
19+
20+
```Python
21+
输入:nums = [3,2,3]
22+
输出:3
1123

12-
可以利用哈希表。
1324

14-
遍历一遍数组 nums,用哈希表统计每个元素 num 出现的次数,再遍历一遍哈希表,找出元素个数最多的元素即可。
25+
输入:nums = [2,2,1,1,1,2,2]
26+
输出:2
27+
```
1528

16-
时间复杂度为:O(N)
29+
## 解题思路
1730

18-
空间复杂度为:O(N)
31+
### 思路 1:哈希表
1932

20-
## 代码
33+
1. 遍历数组 `nums`
34+
2. 对于当前元素 `num`,用哈希表统计每个元素 `num` 出现的次数。
35+
3. 再遍历一遍哈希表,找出元素个数最多的元素即可。
36+
37+
### 思路 1:代码
2138

2239
```Python
2340
class Solution:
@@ -37,3 +54,7 @@ class Solution:
3754
return max_index
3855
```
3956

57+
### 思路 1:复杂度分析
58+
59+
- **时间复杂度**:$O(n)$。
60+
- **空间复杂度**:$O(n)$。

‎Solutions/0179. 最大数.md

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,35 @@
55

66
## 题目大意
77

8-
给定一个非负整数数组 `nums`
8+
**描述**:给定一个非负整数数组 `nums`
99

10-
要求:将数组中的数字拼接起来排成一个数,打印能拼接出的所有数字中的最大的一个。
10+
**要求**:重新排列数组中每个数的顺序,使之将数组中所有数字按顺序拼接起来所组成的整数最大。
11+
12+
**说明**:
13+
14+
- 1ドル \le nums.length \le 100$。
15+
- 0ドル \le nums[i] \le 10^9$。
16+
17+
**示例**:
18+
19+
```Python
20+
输入:nums = [10,2]
21+
输出:"210"
22+
23+
24+
输入:nums = [3,30,34,5,9]
25+
输出:"9534330"
26+
```
1127

1228
## 解题思路
1329

30+
### 思路 1:排序
31+
1432
本质上是给数组进行排序。假设 `x``y` 是数组 `nums` 中的两个元素。如果拼接字符串 `x + y < y + x`,则 `y > x ``y` 应该排在 `x` 前面。反之,则 `y < x`
1533

16-
按照上述规则,对原数组进行排序即可。这里使用了 `functools.cmp_to_key` 自定义排序函数。
34+
按照上述规则,对原数组进行排序即可。这里我们使用了 `functools.cmp_to_key` 自定义排序函数。
1735

18-
##代码
36+
### 思路 1:代码
1937

2038
```Python
2139
import functools
@@ -34,3 +52,7 @@ class Solution:
3452
return str(int(''.join(nums_s)))
3553
```
3654

55+
### 思路 1:复杂度分析
56+
57+
- **时间复杂度**:$O(n^2)$。其中 $n$ 是给定数组 `nums` 的大小。
58+
- **空间复杂度**:$O(n)$。

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /