📌  相关文章
📜  给定链表中 K 个连续节点的最大总和(1)

📅  最后修改于: 2023-12-03 15:41:17.770000             🧑  作者: Mango

题目描述

给定一个链表和一个整数 K,找出链表中 K 个连续节点的最大总和。

示例

输入:head = [1,3,-1,4,2,1], k = 3 输出:6 解释:第一个3个元素的和为6,第二个3个元素的和为7,最大和为7。

解题思路

可以使用滑动窗口的方法来解决本题,使用两个指针left和right代表滑动窗口的左右端点,sum表示当前窗口内元素的和,max_sum表示滑动窗口在所有可能的窗口内元素之和的最大值。

具体步骤如下:

  • 初始化left和right指向链表头结点,sum等于left、right、right->next的节点值之和。
  • 从left向右移动一个节点,从sum中减去left的节点值,加上right->next的节点值。
  • 当right指向链表尾节点时,跳出循环。
  • 若当前滑动窗口内元素之和大于max_sum,则更新max_sum的值。
  • 返回max_sum的值。
代码实现
int findMaxSum(ListNode* head, int k) {
    if (!head || k == 0) {
        return 0;
    }

    int sum = 0;
    ListNode* left = head;
    ListNode* right = head;
    for (int i = 0; i < k - 1; i++) {
        sum += right->val;
        right = right->next;
    }
    int max_sum = sum + right->val;

    while (right->next) {
        left = left->next;
        right = right->next;
        sum -= left->val;
        sum += right->val;
        max_sum = max(max_sum, sum);
    }

    return max_sum;
}
总结

本题采用了滑动窗口的思想,可以在O(n)的时间复杂度内解决。在实现时,需要注意链表为空或K为0的特殊情况。