📜  在链表中查找峰值元素(1)

📅  最后修改于: 2023-12-03 14:51:34.150000             🧑  作者: Mango

在链表中查找峰值元素

简介

峰值元素指的是在一个数组、序列或者链表中,存在一个元素大于它的相邻元素,这个元素被称为峰值元素。本文主要介绍如何在链表中查找峰值元素。

方法
方法一

思路

遍历链表,依次对比每个节点和它相邻的节点的值,如果当前节点的值大于前后节点的值,则当前节点就是峰值元素。

代码

def find_peak_element(head):
    if not head or not head.next:
        return head

    prev = head
    curr = head.next

    while curr and curr.next:
        if curr.val > prev.val and curr.val > curr.next.val:
            return curr
        prev = curr
        curr = curr.next

    return None

时间复杂度

O(n),其中 n 是链表的长度。

方法二

思路

可以使用二分查找的思想来查找峰值元素。在链表上进行二分查找需要先遍历一遍链表获取链表的长度,然后再进行二分查找。

具体实现时,将链表分成两部分,分别查找左半部分和右半部分。对于左半部分,如果中间节点的值大于它的前一个节点的值,则在左半部分一定存在峰值元素;否则在右半部分查找。右半部分同理。

代码

def find_peak_element(head):
    if not head or not head.next:
        return head

    length = 0
    curr = head

    while curr:
        length += 1
        curr = curr.next

    left, right = 0, length - 1

    while left <= right:
        mid = (left + right) // 2

        prev = None
        curr = head
        for i in range(mid):
            prev = curr
            curr = curr.next

        if prev and curr and curr.val < prev.val:
            right = mid - 1
        elif curr.next and curr.next.val > curr.val:
            left = mid + 1
        else:
            return curr

    return None

时间复杂度

O(logn),其中 n 是链表的长度。

总结

本文介绍了两种在链表中查找峰值元素的方法,一种是遍历链表,一种是使用二分查找的思想。二分查找的时间复杂度更优,但需要先遍历一遍链表获取长度。根据实际情况选择合适的方法,可以提高代码的效率。