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

📅  最后修改于: 2022-05-13 01:57:44.185000             🧑  作者: Mango

给定链表中 K 个连续节点的最大总和

给定一个链表,任务是找到将链表的任意 k 个连续节点相加得到的最大和。

例子:

方法:想法是使用大小为 k 的滑动窗口,跟踪当前窗口的总和并在需要时更新最大总和。为了实现滑动窗口,可以使用两个指针来表示起点和终点。在每个步骤中,首先从当前和中减去 start 指向的节点的值,并将 end 指向的节点的值添加到当前和中。将此总和与最大总和进行比较,并在需要时更新结果。开始和结束指针在每一步增加 1。



下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Structure of a node
struct Node {
    int data;
    Node* next;
};
 
// Function to create new node
Node* newNode(int data)
{
    Node* node = new Node;
    node->next = NULL;
    node->data = data;
    return node;
}
 
// Function to return the maximum sum of
// k consecutive nodes
int findMaxSum(Node* head, int k)
{
    // To store current window sum
    int sum = 0;
 
    // To store maximum sum
    int maxSum = 0;
 
    // Pointer to the start of window
    Node* start = head;
 
    // Pointer to the end of window
    Node* end = head;
 
    int i;
 
    // Find the sum of first k nodes
    for (i = 0; i < k; i++) {
        sum += end->data;
        end = end->next;
    }
 
    maxSum = sum;
 
    // Move window by one step and
    // update sum. Node pointed by
    // start is excluded from current
    // window so subtract it. Node
    // pointed by end is added to
    // current window so add its value.
    while (end != NULL) {
 
        // Subtract the starting element
        // from previous window
        sum -= start->data;
        start = start->next;
 
        // Add the element next to the end
        // of previous window
        sum += end->data;
        end = end->next;
 
        // Update the maximum sum so far
        maxSum = max(maxSum, sum);
    }
 
    return maxSum;
}
 
// Driver code
int main()
{
    Node* head = newNode(1);
    head->next = newNode(2);
    head->next->next = newNode(3);
    head->next->next->next = newNode(4);
    head->next->next->next->next = newNode(5);
    head->next->next->next->next->next = newNode(6);
 
    int k = 5;
 
    cout << findMaxSum(head, k);
 
    return 0;
}


Java
// Java implementation of the approach
class GFG
{
 
// Structure of a node
static class Node
{
    int data;
    Node next;
};
 
// Function to create new node
static Node newNode(int data)
{
    Node node = new Node();
    node.next = null;
    node.data = data;
    return node;
}
 
// Function to return the maximum sum of
// k consecutive nodes
static int findMaxSum(Node head, int k)
{
    // To store current window sum
    int sum = 0;
 
    // To store maximum sum
    int maxSum = 0;
 
    // Pointer to the start of window
    Node start = head;
 
    // Pointer to the end of window
    Node end = head;
 
    int i;
 
    // Find the sum of first k nodes
    for (i = 0; i < k; i++)
    {
        sum += end.data;
        end = end.next;
    }
 
    maxSum = sum;
 
    // Move window by one step and
    // update sum. Node pointed by
    // start is excluded from current
    // window so subtract it. Node
    // pointed by end is added to
    // current window so add its value.
    while (end != null)
    {
 
        // Subtract the starting element
        // from previous window
        sum -= start.data;
        start = start.next;
 
        // Add the element next to the end
        // of previous window
        sum += end.data;
        end = end.next;
 
        // Update the maximum sum so far
        maxSum = Math.max(maxSum, sum);
    }
    return maxSum;
}
 
// Driver code
public static void main(String[] args)
{
    Node head = newNode(1);
    head.next = newNode(2);
    head.next.next = newNode(3);
    head.next.next.next = newNode(4);
    head.next.next.next.next = newNode(5);
    head.next.next.next.next.next = newNode(6);
 
    int k = 5;
    System.out.print(findMaxSum(head, k));
}
}
 
// This code is contributed by PrinciRaj1992


Python3
# Python3 implementation of the approach
 
# Node of Linked List
class Node:
     
    def __init__(self, x):
         
        self.data = x
        self.next = None
 
# Function to return the maximum sum of
# k consecutive nodes
def findMaxSum(head, k):
     
    # To store current window sum
    sum = 0
 
    # To store maximum sum
    maxSum = 0
 
    # Pointer to the start of window
    start = head
 
    # Pointer to the end of window
    end = head
     
    # Find the sum of first k nodes
    for i in range(k):
        sum += end.data
        end = end.next
 
    maxSum = sum
 
    # Move window by one step and
    # update sum. Node pointed by
    # start is excluded from current
    # window so subtract it. Node
    # pointed by end is added to
    # current window so add its value.
    while (end != None):
 
        # Subtract the starting element
        # from previous window
        sum -= start.data
        start = start.next
 
        # Add the element next to the end
        # of previous window
        sum += end.data
        end = end.next
 
        # Update the maximum sum so far
        maxSum = max(maxSum, sum)
 
    return maxSum
 
# Driver code
if __name__ == '__main__':
     
    head = Node(1)
    head.next = Node(2)
    head.next.next = Node(3)
    head.next.next.next = Node(4)
    head.next.next.next.next = Node(5)
    head.next.next.next.next.next = Node(6)
 
    k = 5
 
    print(findMaxSum(head, k))
 
# This code is contributed by mohit kumar 29


C#
// C# implementation of the approach
using System;
 
class GFG
{
 
// Structure of a node
public class Node
{
    public int data;
    public Node next;
};
 
// Function to create new node
static Node newNode(int data)
{
    Node node = new Node();
    node.next = null;
    node.data = data;
    return node;
}
 
// Function to return the maximum sum of
// k consecutive nodes
static int findMaxSum(Node head, int k)
{
    // To store current window sum
    int sum = 0;
 
    // To store maximum sum
    int maxSum = 0;
 
    // Pointer to the start of window
    Node start = head;
 
    // Pointer to the end of window
    Node end = head;
 
    int i;
 
    // Find the sum of first k nodes
    for (i = 0; i < k; i++)
    {
        sum += end.data;
        end = end.next;
    }
 
    maxSum = sum;
 
    // Move window by one step and
    // update sum. Node pointed by
    // start is excluded from current
    // window so subtract it. Node
    // pointed by end is added to
    // current window so add its value.
    while (end != null)
    {
 
        // Subtract the starting element
        // from previous window
        sum -= start.data;
        start = start.next;
 
        // Add the element next to the end
        // of previous window
        sum += end.data;
        end = end.next;
 
        // Update the maximum sum so far
        maxSum = Math.Max(maxSum, sum);
    }
    return maxSum;
}
 
// Driver code
public static void Main(String[] args)
{
    Node head = newNode(1);
    head.next = newNode(2);
    head.next.next = newNode(3);
    head.next.next.next = newNode(4);
    head.next.next.next.next = newNode(5);
    head.next.next.next.next.next = newNode(6);
 
    int k = 5;
    Console.Write(findMaxSum(head, k));
}
}
 
// This code is contributed by Rajput-Ji


Javascript


输出:
20

时间复杂度: O(n)
辅助空间: O(1)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程