返回
162. 寻找峰值
前端
2024-01-24 06:23:35
**LeetCode 第 25 天 🐱🏍**
LeetCode 第 25 天,让我们共同探索 旋转链表 的奥秘。今天,我们将深入研究 162. 寻找峰值 和 61. 旋转链表 这两个极具挑战性的算法问题。
**题目:**
给你一个整数数组 nums,找到峰值元素索引。峰值元素是指其值大于左右相邻值的元素。
**示例:**
输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,其值大于左右相邻值。
**思路:**
- 使用两个指针
left
和right
分别指向数组的开头和结尾。 - 在
while
循环中,如果nums[left]
大于nums[right]
,则峰值元素位于left
和mid
之间。更新right
指针为mid - 1
。 - 如果
nums[left]
小于nums[right]
,则峰值元素位于mid + 1
和right
之间。更新left
指针为mid + 1
。 - 继续循环,直到
left
和right
指针相遇。此时,left
和right
指向的元素就是峰值元素。
**代码:**
def findPeakElement(nums):
left, right = 0, len(nums) - 1
while left < right:
mid = left + (right - left) // 2
if nums[mid] > nums[mid + 1]:
right = mid
else:
left = mid + 1
return nums[left]
**复杂度分析:**
- 时间复杂度:O(log n)。
- 空间复杂度:O(1)。
**题目:**
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
**示例:**
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
**思路:**
- 首先,计算链表的长度
n
。 - 然后,将链表分成两部分:第一部分包含
n - k
个节点,第二部分包含k
个节点。 - 将第二部分的链表连接到第一部分链表的后面,形成一个新的链表。
- 最后,返回新链表的头节点。
**代码:**
def rotateRight(head, k):
if not head or not head.next or k == 0:
return head
# 计算链表的长度
n = 0
curr = head
while curr:
n += 1
curr = curr.next
# 将链表分成两部分
k = k % n
curr = head
for _ in range(n - k - 1):
curr = curr.next
# 将第二部分的链表连接到第一部分链表的后面
new_head = curr.next
curr.next = None
curr = new_head
while curr.next:
curr = curr.next
curr.next = head
return new_head
**复杂度分析:**
- 时间复杂度:O(n),其中 n 是链表的长度。
- 空间复杂度:O(1)。
**总结:**
今天,我们一起探索了 162. 寻找峰值 和 61. 旋转链表 这两个极具挑战性的算法问题。通过详细的讲解和示例代码,相信你对这些算法有了更深刻的理解。
算法的本质在于理解和应用。在未来的日子里,继续挑战自我,不断探索和学习,你一定能成为算法高手!