有效的山脉数组 LeetCode 问题,需在 Python 中解决,请帮忙审查代码

-1 投票
1 回答
63 浏览
提问于 2025-04-14 16:10

在这里输入图片描述

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) 混淆了。
  • 还有一个没提到的问题:即使解决了上面两个主要问题,你的方法也不能确保值的严格顺序(这可能是你想通过禁止重复来实现的)。
  • 最后(虽然这不是导致你算法失败的原因),不要把变量命名为 listindex:覆盖 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]

撰写回答