941 有效的山脉数组

题目 941 有效的山脉数组

给定一个整数数组 arr,如果它是有效的山脉数组就返回 true,否则返回 false。

让我们回顾一下,如果 arr 满足下述条件,那么它是一个山脉数组:

  • arr.length >= 3
  • 在 0 < i < arr.length - 1 条件下,存在 i 使得:
  • arr[0] < arr[1] < ... arr[i-1] < arr[i]
  • arr[i] > arr[i+1] > ... > arr[arr.length - 1]

示例 1:

输入:arr = [2,1]
输出:false

示例 2:

输入:arr = [3,5,5]
输出:false

示例 3:

输入:arr = [0,3,2,1]
输出:true

思路

  • 首先想到的是双指针方法,有两种思路。第一种是循环数组,从该数组定义左右指针往两边循环取判断,但是该方法会导致很多重复的遍历。第二种直接从两端定义左右指针往中间循环。

注意:一定要注意指针的范围,不要超过数组下标,这道题我在这犯错太多了哈哈。

  • 代码中有两个循环中的左右指针范围。第一个要减去2,首先必须要减1,因为全是升序数组不是山脉[1,2,3,4,5],所以一开始我减1,但是前面有个数组下标left+1,如果减1则会导致数组越界,因为当arr[left]<arr[left+1]的时候,left会指向超出数组越界,所以必须减2。右指针范围同这个道理。

代码

class Solution:
    def validMountainArray(self, arr: List[int]) -> bool:
        if len(arr) <=2:
            return False
        left = 0
        right = len(arr) - 1
        while arr[left] < arr[left+1] and left < (len(arr)-2):  // 要减2,不是不减,也不是减1
            left += 1
        while arr[right] < arr[right-1] and right > 1:  // 要大于1,不是大于0
            right -= 1
        if left >= right:
            return True
        else:
            return False

想通后

  • 直接把范围放and前面即可,为了避免升序数组或降序数组成为漏掉的极端,在判断山脉时可以加上left!=0和right!=len(arr)-1。相对于前面那样更容易理解一些。
class Solution:
    def validMountainArray(self, arr: List[int]) -> bool:
        if len(arr) <=2:
            return False
        left = 0
        right = len(arr) - 1
        while left < (len(arr)-1) and arr[left] < arr[left+1]: 
            left += 1
        while right > 1 and arr[right] < arr[right-1]:
            right -= 1
        if left >= right and right != len(arr)-1 and left != 0:
            return True
        else:
            return False
posted @ 2022-11-10 21:58  时光如你般美好  阅读(19)  评论(0编辑  收藏  举报