Skip to content

Commit 5317114

Browse files
committed
更新题解列表
1 parent a684af2 commit 5317114

4 files changed

Lines changed: 185 additions & 35 deletions

File tree

Solutions/0334. 递增的三元子序列.md

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,35 +9,60 @@
99

1010
## 题目大意
1111

12-
给定一个整数数组 `nums`
12+
**描述**给定一个整数数组 $nums$
1313

14-
要求:判断数组中是否存在长度为 3 的递增子序列。要求算法时间复杂度为 $O(n)$、空间复杂度为 $O(1)$
14+
**要求**:判断数组中是否存在长度为 3 的递增子序列。
1515

16-
- 长度为 3 的递增子序列:存在这样的三元组下标 (`i`, `j`, `k`) 且满足 `i < j < k` ,使得 `nums[i] < nums[j] < nums[k]`
16+
**说明**
17+
18+
- 要求算法时间复杂度为 $O(n)$、空间复杂度为 $O(1)$。
19+
- **长度为 $3$ 的递增子序列**:存在这样的三元组下标 ($i$, $j$, $k$) 且满足 $i < j < k$ ,使得 $nums[i] < nums[j] < nums[k]$。
20+
- $1 \le nums.length \le 5 \times 10^5$。
21+
- $-2^{31} \le nums[i] \le 2^{31} - 1$。
22+
23+
**示例**
24+
25+
- 示例 1:
26+
27+
```python
28+
输入:nums = [1,2,3,4,5]
29+
输出:true
30+
解释:任何 i < j < k 的三元组都满足题意
31+
```
32+
33+
- 示例 2:
34+
35+
```python
36+
输入:nums = [5,4,3,2,1]
37+
输出:false
38+
解释:不存在满足题意的三元组
39+
```
1740

1841
## 解题思路
1942

43+
### 思路 1:快慢指针
44+
2045
常规方法是三重 `for` 循环遍历三个数,但是时间复杂度为 $O(n^3)$,肯定会超时的。
2146

2247
那么如何才能只进行一次遍历,就找到长度为 3 的递增子序列呢?
2348

24-
假设长度为 3 的递增子序列元素为 `a``b``c``a < b < c`
49+
假设长度为 3 的递增子序列元素为 $a$、$b$、$c$,$a < b < c$
2550

26-
先来考虑 `a``b`。如果我们要使得一个数组 `i < j`,并且 `nums[i] < nums[j]`。那么应该使得 `a` 尽可能的小,这样子我们下一个数字 `b` 才可以尽可能地满足条件。
51+
先来考虑 $a$$b$。如果我们要使得一个数组 $i < j$,并且 $nums[i] < nums[j]$。那么应该使得 $a$ 尽可能的小,这样子我们下一个数字 $b$ 才可以尽可能地满足条件。
2752

28-
同样对于 `b``c`,也应该使得 `b` 尽可能的小,下一个数字 `c` 才可以尽可能的满足条件。
53+
同样对于 $b$$c$,也应该使得 $b$ 尽可能的小,下一个数字 $c$ 才可以尽可能的满足条件。
2954

30-
所以,我们的目的是:在 `a < b` 的前提下,保证 a 尽可能小。在 `b < c` 的条件下,保证 `b` 尽可能小。
55+
所以,我们的目的是:在 $a < b$ 的前提下,保证 a 尽可能小。在 $b < c$ 的条件下,保证 $b$ 尽可能小。
3156

32-
我们可以使用两个数 `a``b` 指向无穷大。遍历数组:
57+
我们可以使用两个数 $a$、$b$ 指向无穷大。遍历数组:
3358

34-
- 如果当前数字小于等于 `a` ,则更新 `a = num`
35-
- 如果当前数字大于等于 `a`,则说明当前数满足 `num > a`,则判断:
36-
- 如果 `num` 小于等于 `b`,则更新 `b = num`
37-
- 如果 `num` 大于 `b`,则说明找到了长度为 3 的递增子序列,直接输出 `True`
38-
- 如果遍历完仍未找到,则输出 `False`
59+
- 如果当前数字小于等于 $a$ ,则更新 `a = num`
60+
- 如果当前数字大于等于 $a$,则说明当前数满足 $num > a$,则判断:
61+
- 如果 $num \le b$,则更新 `b = num`
62+
- 如果 $num > b$,则说明找到了长度为 3 的递增子序列,直接输出 $True$
63+
- 如果遍历完仍未找到,则输出 $False$
3964

40-
## 代码
65+
### 思路 1:代码
4166

4267
```python
4368
class Solution:
@@ -54,3 +79,8 @@ class Solution:
5479
return False
5580
```
5681

82+
### 思路 1:复杂度分析
83+
84+
- **时间复杂度**:$O(n)$。
85+
- **空间复杂度**:$O(1)$。
86+

Solutions/0845. 数组中的最长山脉.md

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,50 @@
99

1010
## 题目大意
1111

12-
给定一个整数数组 `arr`
12+
**描述**给定一个整数数组 $arr$
1313

14-
要求:返回最长「山脉」长度。如果不含有 「山脉」 则返回 0
14+
**要求**:返回最长山脉子数组的长度。如果不存在山脉子数组,返回 $0$
1515

16-
- 山脉:数组`arr` 中满足 `arr[i - a] < ... < arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[i + b]` 的连续子数组。
16+
**说明**
17+
18+
- **山脉数组**:符合下列属性的数组 $arr$ 称为山脉数组。
19+
- $arr.length \ge 3$。
20+
- 存在下标 $i(0 < i < arr.length - 1)$ 满足:
21+
- $arr[0] < arr[1] < … < arr[i]$
22+
- $arr[i] > arr[i + 1] > … > arr[arr.length - 1]$
23+
24+
- $1 \le arr.length \le 10^4$。
25+
- $0 \le arr[i] \le 10^4$。
26+
27+
**示例**
28+
29+
- 示例 1:
30+
31+
```python
32+
输入:arr = [2,1,4,7,3,2,5]
33+
输出:5
34+
解释:最长的山脉子数组是 [1,4,7,3,2],长度为 5
35+
```
36+
37+
- 示例 2:
38+
39+
```python
40+
输入:arr = [2,2,2]
41+
输出:0
42+
解释:不存在山脉子数组。
43+
```
1744

1845
## 解题思路
1946

20-
- 使用变量 `ans` 保存最长山脉长度。
21-
- 遍历数组,假定当前节点为山峰。
22-
- 使用双指针 `left``right` 分别向左、向右查找山脉的长度。
23-
- 如果当前山脉的长度比最长山脉长度更长,则更新最长山脉长度。
24-
- 最后输出 `ans`
47+
### 思路 1:快慢指针
2548

26-
## 代码
49+
1. 使用变量 $ans$ 保存最长山脉长度。
50+
2. 遍历数组,假定当前节点为山峰。
51+
3. 使用双指针 $left$、$right$ 分别向左、向右查找山脉的长度。
52+
4. 如果当前山脉的长度比最长山脉长度更长,则更新最长山脉长度。
53+
5. 最后输出 $ans$。
54+
55+
### 思路 1:代码
2756

2857
```python
2958
class Solution:
@@ -44,3 +73,8 @@ class Solution:
4473
return res
4574
```
4675

76+
### 思路 1:复杂度分析
77+
78+
- **时间复杂度**:$O(n)$,其中 $n$ 为数组 $arr$ 中的元素数量。
79+
- **空间复杂度**:$O(1)$。
80+

Solutions/0978. 最长湍流子数组.md

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,50 @@
99

1010
## 题目大意
1111

12-
给定一个数组 `arr`。当 `arr` 的子数组 `arr[i]``arr[i + 1]``...``arr[j]` 满足下列条件时,我们称其为湍流子数组:
12+
**描述**给定一个数组 $arr$。当 $arr$ 的子数组 $arr[i]$,$arr[i + 1]$,$...$, $arr[j]$ 满足下列条件时,我们称其为湍流子数组:
1313

14-
- `i <= k < j`,当 `k` 为奇数时, `arr[k] > arr[k + 1]`,且当 `k` 为偶数时,`arr[k] < arr[k + 1]`
15-
- 或若 `i <= k < j`,当 `k` 为偶数时,`arr[k] > arr[k + 1]` ,且当 `k` 为奇数时,`arr[k] < arr[k + 1]`
14+
- 如果 $i \le k < j$,当 $k$ 为奇数时, $arr[k] > arr[k + 1]$,且当 $k$ 为偶数时,$arr[k] < arr[k + 1]$
15+
- 或如果 $i \le k < j$,当 $k$ 为偶数时,$arr[k] > arr[k + 1]$ ,且当 $k$ 为奇数时,$arr[k] < arr[k + 1]$
1616
- 也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
1717

18-
要求:返回给定数组 `arr` 的最大湍流子数组的长度。
18+
**要求**:返回给定数组 $arr$ 的最大湍流子数组的长度。
19+
20+
**说明**
21+
22+
- $1 \le arr.length \le 4 \times 10^4$。
23+
- $0 \le arr[i] \le 10^9$。
24+
25+
**示例**
26+
27+
- 示例 1:
28+
29+
```python
30+
输入:arr = [9,4,2,10,7,8,8,1,9]
31+
输出:5
32+
解释:arr[1] > arr[2] < arr[3] > arr[4] < arr[5]
33+
```
34+
35+
- 示例 2:
36+
37+
```python
38+
输入:arr = [4,8,12,16]
39+
输出:2
40+
```
1941

2042
## 解题思路
2143

22-
湍流子数组实际上像波浪一样,比如 `arr[i - 2] > arr[i - 1] < arr[i] > arr[i + 1] < arr[i + 2]`。所以我们可以使用双指针的做法。具体做法如下:
44+
### 思路 1:快慢指针
2345

24-
- 使用两个指针 `left``right``left` 指向湍流子数组的左端,`right` 指向湍流子数组的右端。
25-
- 如果 `arr[right - 1] == arr[right]`,则更新 `left = right`,重新开始计算最长湍流子数组大小。
26-
- 如果 `arr[right - 2] < arr[right - 1] < arr[right]`,此时为递增数组,则 `left``right - 1` 开始重新计算最长湍流子数组大小。
27-
- 如果 `arr[right - 2] > arr[right - 1] > arr[right]`,此时为递减数组,则 `left``right - 1` 开始重新计算最长湍流子数组大小。
28-
- 其他情况(即 `arr[right - 2] < arr[right - 1] > arr[right]``arr[right - 2] > arr[right - 1] < arr[right]`)时,不用更新 `left`值。
29-
- 更新最大湍流子数组的长度,并向右移动 `right`。直到 `right >= len(arr)` 时,返回答案 `ans`
46+
湍流子数组实际上像波浪一样,比如 $arr[i - 2] > arr[i - 1] < arr[i] > arr[i + 1] < arr[i + 2]$。所以我们可以使用双指针的做法。具体做法如下:
3047

31-
## 代码
48+
- 使用两个指针 $left$、$right$。$left$ 指向湍流子数组的左端,$right$ 指向湍流子数组的右端。
49+
- 如果 $arr[right - 1] == arr[right]$,则更新 `left = right`,重新开始计算最长湍流子数组大小。
50+
- 如果 $arr[right - 2] < arr[right - 1] < arr[right]$,此时为递增数组,则 $left$ 从 $right - 1$ 开始重新计算最长湍流子数组大小。
51+
- 如果 $arr[right - 2] > arr[right - 1] > arr[right]$,此时为递减数组,则 $left$ 从 $right - 1$ 开始重新计算最长湍流子数组大小。
52+
- 其他情况(即 $arr[right - 2] < arr[right - 1] > arr[right]$ 或 $arr[right - 2] > arr[right - 1] < arr[right]$)时,不用更新 $left$值。
53+
- 更新最大湍流子数组的长度,并向右移动 $right$。直到 $right \ge len(arr)$ 时,返回答案 $ans$。
54+
55+
### 思路 1:代码
3256

3357
```python
3458
class Solution:
@@ -49,3 +73,8 @@ class Solution:
4973
return ans
5074
```
5175

76+
### 思路 1:复杂度分析
77+
78+
- **时间复杂度**:$O(n)$,其中 $n$ 为数组 $arr$ 中的元素数量。
79+
- **空间复杂度**:$O(1)$。
80+

Solutions/1051. 高度检查器.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# [1051. 高度检查器](https://leetcode.cn/problems/height-checker/)
2+
3+
- 标签:数组、计数排序、排序
4+
- 难度:简单
5+
6+
## 题目链接
7+
8+
- [1051. 高度检查器 - 力扣](https://leetcode.cn/problems/height-checker/)
9+
10+
## 题目大意
11+
12+
**描述**
13+
14+
**要求**
15+
16+
**说明**
17+
18+
-
19+
20+
**示例**
21+
22+
- 示例 1:
23+
24+
```python
25+
```
26+
27+
- 示例 2:
28+
29+
```python
30+
```
31+
32+
## 解题思路
33+
34+
### 思路 1:
35+
36+
### 思路 1:代码
37+
38+
```Python
39+
```
40+
41+
### 思路 1:复杂度分析
42+
43+
- **时间复杂度**
44+
- **空间复杂度**
45+
46+
### 思路 2:
47+
48+
### 思路 2:代码
49+
50+
```python
51+
```
52+
53+
### 思路 2:复杂度分析
54+
55+
- **时间复杂度**
56+
- **空间复杂度**
57+

0 commit comments

Comments
 (0)