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