leetcode算法

leetcode链表之找出临界值之间的最小和最大距离

2022-04-13  本文已影响0人  小奚有话说

2058、找出临界值之间的最小和最大距离

题目:

链表中的 临界点 定义为一个 局部极大值点 或 局部极小值点 。

如果当前节点的值 严格大于 前一个节点和后一个节点,那么这个节点就是一个 局部极大值点 。

如果当前节点的值 严格小于 前一个节点和后一个节点,那么这个节点就是一个 局部极小值点 。

注意:节点只有在同时存在前一个节点和后一个节点的情况下,才能成为一个 局部极大值点 / 极小值点 。

给你一个链表 head ,返回一个长度为 2 的数组 [minDistance, maxDistance] ,其中 minDistance 是任意两个不同临界点之间的最小距离,maxDistance 是任意两个不同临界点之间的最大距离。如果临界点少于两个,则返回 [-1,-1] 。

示例1:

输入:head = [3,1]
输出:[-1,-1]

示例2:

输入:head = [5,3,1,2,5,1,2]
输出:[1,3]

示例3:

输入:head = [1,3,2,2,3,2,2,2,7]
输出:[3,3]

示例4:

输入:head = [2,3,3,2]
输出:[-1,-1]

思路:

遍历链表可以找到局部极大值和局部极小值,最大距离就是首尾两个极值位置之差,最小距离就是取两个极值之间的最小距离.

class Solution:
    def nodesBetweenCriticalPoints(self, head: Optional[ListNode]) -> List[int]:
        if not head or not head.next or not head.next.next: return [-1, -1]
        prev, cur = head, head.next
        pos = 2
        first, last = -1, -1
        minDis, maxDis = -1, -1
        while cur.next:
            # 判断极值点
            if (prev.val > cur.val and cur.next.val > cur.val) or (prev.val < cur.val and cur.next.val < cur.val):
                if last != -1:
                    # 最小距离,每次取这次极值位置和上次极值的差,取最小值
                    minDis = (pos - last) if minDis == -1 else min(minDis, pos - last)
                    maxDis = pos - first
                # first记录首个极值的位置,用来求最大距离
                if first == -1:
                    first = pos
                # last记录上个极值的位置
                last = pos
            prev = cur
            cur = cur.next
            pos += 1
        return [minDis, maxDis]
上一篇下一篇

猜你喜欢

热点阅读