有效的山脉数组 LeetCode 问题,需在 Python 中解决,请帮忙审查代码
class Solution(object):
def validMountainArray(self, arr):
"""
:type arr: List[int]
:rtype: bool
"""
list=[]
for i in arr:
if i not in list:
list.append(i)
if len(list)==len(arr):
maxi=max(arr)
index=arr.index(maxi)
if arr[:index]==arr[:index].sort() and arr[index:]==arr[index:].sort(reverse=True):
return True
对于测试用例 [0,3,2,1],期望的结果是 True,但实际输出是 False。这是为什么呢?问题出在哪里?
1 个回答
0
我先来讲讲你解决方案中的一些问题(大部分已经在评论里提到过了):
- 你禁止数组中出现重复值,但其实应该允许重复值(就像山的两边各有一个)。
- 你把 arr.sort()(这个方法会直接在原数组上排序,并且返回 None)和 sorted(arr) 混淆了。
- 还有一个没提到的问题:即使解决了上面两个主要问题,你的方法也不能确保值的严格顺序(这可能是你想通过禁止重复来实现的)。
- 最后(虽然这不是导致你算法失败的原因),不要把变量命名为
list
或index
:覆盖 Python 的内置名称是很危险的。
现在,作为一个喜欢 itertools
模块的人,这里有一个利用它的解决方案:我把数组转换成一系列符号(也就是一个值和下一个值之间的变化符号),然后去掉连续的符号;对于一个有效的山形,预期结果就是 [1, -1]:
from itertools import pairwise, groupby
class Solution(object):
def validMountainArray(self, arr):
def diff_sgn(pair):
return 1 if pair[1] > pair[0] else -1 if pair[1] < pair[0] else 0
return [flag for flag, _ in groupby(map(diff_sgn, pairwise(arr)))] == [1, -1]