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