Skip to content

Commit 3cccd79

Browse files
committed
【update】专题-双指针
1 parent 0dc5d67 commit 3cccd79

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

C-算法/专题-B-双指针.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Index
3030
- [最小覆盖子串(Minimum Window Substring)](#最小覆盖子串minimum-window-substring)
3131
- [长度最小的子数组(Minimum Size Subarray Sum)](#长度最小的子数组minimum-size-subarray-sum)
3232
- [其他](#其他)
33+
- [数组中的最长山脉(Longest Mountain in Array)](#数组中的最长山脉longest-mountain-in-array)
3334
- [合并两个有序数组(Merge Sorted Array)](#合并两个有序数组merge-sorted-array)
3435
- [接雨水(Trapping Rain Water)(一维)](#接雨水trapping-rain-water一维)
3536
- [颜色分类(Sort Colors)](#颜色分类sort-colors)
@@ -588,6 +589,109 @@ class Solution:
588589

589590
# 其他
590591

592+
## 数组中的最长山脉(Longest Mountain in Array)
593+
> LeetCode/[845. 数组中的最长山脉](https://leetcode-cn.com/problems/longest-mountain-in-array/description/)
594+
595+
**问题描述**
596+
```
597+
我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:
598+
599+
B.length >= 3
600+
存在 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1]
601+
(注意:B 可以是 A 的任意子数组,包括整个数组 A。)
602+
603+
给出一个整数数组 A,返回最长 “山脉” 的长度。
604+
605+
如果不含有 “山脉” 则返回 0。
606+
607+
示例 1:
608+
输入:[2,1,4,7,3,2,5]
609+
输出:5
610+
解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。
611+
612+
示例 2:
613+
输入:[2,2,2]
614+
输出:0
615+
解释:不含 “山脉”。
616+
617+
提示:
618+
0 <= A.length <= 10000
619+
0 <= A[i] <= 10000
620+
```
621+
622+
**思路 1**
623+
- 先找到“山峰”,然后向两侧移动指针,寻找左右“山脚”
624+
- 极端情况下,可能会遍历**两次数组**(左指针有一个回溯的过程)
625+
626+
- **Python**
627+
```python
628+
class Solution:
629+
def longestMountain(self, A):
630+
"""
631+
:type A: List[int]
632+
:rtype: int
633+
"""
634+
n = len(A)
635+
636+
res = 0
637+
i = 1
638+
while i < n - 1:
639+
# for i in range(1, n - 1):
640+
if A[i - 1] < A[i] > A[i + 1]: # 先找“山峰”
641+
l = i - 1
642+
r = i + 1
643+
while l > 0 and A[l - 1] < A[l]: # 找左侧山脚(回溯)
644+
l -= 1
645+
while r < n - 1 and A[r + 1] < A[r]: # 找右侧山脚
646+
r += 1
647+
648+
res = max(res, r - l + 1)
649+
650+
i = r + 1 #
651+
else:
652+
i += 1
653+
654+
return res
655+
```
656+
657+
**思路 2**
658+
- 同向双指针(滑动窗口),只需遍历一遍数组
659+
- **Python**
660+
```python
661+
class Solution:
662+
def longestMountain(self, A):
663+
"""
664+
:type A: List[int]
665+
:rtype: int
666+
"""
667+
n = len(A)
668+
669+
res = 0
670+
i = 1
671+
while i < n:
672+
l = i - 1 # 左山脚,注意 i 是从 1 开始的
673+
while i < n and A[i] > A[i - 1]:
674+
i += 1
675+
676+
if l == i - 1: # 不是山坡
677+
i += 1
678+
continue
679+
680+
r = i - 1 # 右山脚
681+
while r < n - 1 and A[r] > A[r + 1]:
682+
r += 1
683+
684+
if r == i - 1: # 不是山坡
685+
i += 1
686+
continue
687+
else:
688+
res = max(res, r - l + 1)
689+
i = r + 1 #
690+
691+
return res
692+
```
693+
694+
591695
## 合并两个有序数组(Merge Sorted Array)
592696
> LeetCode/[88. 合并两个有序数组](https://leetcode-cn.com/problems/merge-sorted-array/description/)
593697

0 commit comments

Comments
 (0)