返回

162. 寻找峰值

前端

**LeetCode 第 25 天 🐱‍🏍**

LeetCode 第 25 天,让我们共同探索 旋转链表 的奥秘。今天,我们将深入研究 162. 寻找峰值 61. 旋转链表 这两个极具挑战性的算法问题。

**题目:**

给你一个整数数组 nums,找到峰值元素索引。峰值元素是指其值大于左右相邻值的元素。

**示例:**
输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,其值大于左右相邻值。
**思路:**
  1. 使用两个指针 leftright 分别指向数组的开头和结尾。
  2. while 循环中,如果 nums[left] 大于 nums[right],则峰值元素位于 leftmid 之间。更新 right 指针为 mid - 1
  3. 如果 nums[left] 小于 nums[right],则峰值元素位于 mid + 1right 之间。更新 left 指针为 mid + 1
  4. 继续循环,直到 leftright 指针相遇。此时,leftright 指向的元素就是峰值元素。
**代码:**
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]
**思路:**
  1. 首先,计算链表的长度 n
  2. 然后,将链表分成两部分:第一部分包含 n - k 个节点,第二部分包含 k 个节点。
  3. 将第二部分的链表连接到第一部分链表的后面,形成一个新的链表。
  4. 最后,返回新链表的头节点。
**代码:**
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. 旋转链表 这两个极具挑战性的算法问题。通过详细的讲解和示例代码,相信你对这些算法有了更深刻的理解。

算法的本质在于理解和应用。在未来的日子里,继续挑战自我,不断探索和学习,你一定能成为算法高手!