|
30 | 30 | - [最小覆盖子串(Minimum Window Substring)](#最小覆盖子串minimum-window-substring)
|
31 | 31 | - [长度最小的子数组(Minimum Size Subarray Sum)](#长度最小的子数组minimum-size-subarray-sum)
|
32 | 32 | - [其他](#其他)
|
| 33 | + - [数组中的最长山脉(Longest Mountain in Array)](#数组中的最长山脉longest-mountain-in-array) |
33 | 34 | - [合并两个有序数组(Merge Sorted Array)](#合并两个有序数组merge-sorted-array)
|
34 | 35 | - [接雨水(Trapping Rain Water)(一维)](#接雨水trapping-rain-water一维)
|
35 | 36 | - [颜色分类(Sort Colors)](#颜色分类sort-colors)
|
@@ -588,6 +589,109 @@ class Solution:
|
588 | 589 |
|
589 | 590 | # 其他
|
590 | 591 |
|
| 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 | + |
591 | 695 | ## 合并两个有序数组(Merge Sorted Array)
|
592 | 696 | > LeetCode/[88. 合并两个有序数组](https://leetcode-cn.com/problems/merge-sorted-array/description/)
|
593 | 697 |
|
|
0 commit comments