Skip to content

Latest commit

 

History

History
70 lines (54 loc) · 2.07 KB

0941.有效的山脉数组.md

File metadata and controls

70 lines (54 loc) · 2.07 KB

题目链接

https://leetcode-cn.com/problems/valid-mountain-array/

思路

判断是山峰,主要就是要严格的保存左边到中间,和右边到中间是递增的。

这样可以使用两个指针,left和right,让其按照如下规则移动,如图:

注意这里还是有一些细节,例如如下两点:

  • 因为left和right是数组下表,移动的过程中注意不要数组越界
  • 如果left或者right没有移动,说明是一个单调递增或者递减的数组,依然不是山峰

C++代码如下:

class Solution {
public:
    bool validMountainArray(vector<int>& A) {
        if (A.size() < 3) return false;
        int left = 0;
        int right = A.size() - 1;

        // 注意防止越界
        while (left < A.size() - 1 && A[left] < A[left + 1]) left++;

        // 注意防止越界
        while (right > 0 && A[right] < A[right - 1]) right--;

        // 如果left或者right都在起始位置,说明不是山峰
        if (left == right && left != 0 && right != A.size() - 1) return true;
        return false;
    }
};

Java 版本如下:

class Solution {
    public boolean validMountainArray(int[] arr) {
        if (arr.length < 3) { // 此时,一定不是有效的山脉数组
            return false;
        }
        // 双指针
        int left = 0;
        int right = arr.length - 1;
        // 注意防止指针越界
        while (left + 1 < arr.length && arr[left] < arr[left + 1]) {
            left++;
        }
        // 注意防止指针越界
        while (right > 0 && arr[right] < arr[right - 1]) {
            right--;
        }
        // 如果left或者right都在起始位置,说明不是山峰
        if (left == right && left != 0 && right != arr.length - 1) {
            return true;
        }
        return false;
    }
}

如果想系统学一学双指针的话, 可以看一下这篇双指针法:总结篇!