Saturday, December 28, 2024
Google search engine
HomeData Modelling & AIMaximum circular subarray sum of size K

Maximum circular subarray sum of size K

Given an array arr of size N and an integer K, the task is to find the maximum sum subarray of size k among all contiguous sub-array (considering circular subarray also).

Examples: 

Input: arr = {18, 4, 3, 4, 5, 6, 7, 8, 2, 10}, k = 3 
Output: 
max circular sum = 32 
start index = 9 
end index = 1 
Explanation: 
Maximum Sum = 10 + 18 + 4 = 32

Input: arr = {8, 2, 5, 9}, k = 4 
Output: 
max circular sum = 24 
start index = 0 
end index = 3  

Approach:  

  • Iterate the loop till (n + k) times and
  • Take (i % n) to handle the case when the array index becomes greater than n.

Below is the implementation of above approach:  

C++




// C++ program to find maximum circular
// subarray sum of size k
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate
// maximum sum
void maxCircularSum(int arr[], int n, int k)
{
    // k must be greater
    if (n < k) {
        cout << "Invalid";
        return;
    }
 
    int sum = 0, start = 0, end = k - 1;
 
    // calculate the sum of first k elements.
    for (int i = 0; i < k; i++) {
        sum += arr[i];
    }
 
    int ans = sum;
 
    for (int i = k; i < n + k; i++) {
 
        // add current element to sum
        // and subtract the first element
        // of the previous window.
        sum += arr[i % n] - arr[(i - k) % n];
 
        if (sum > ans) {
            ans = sum;
            start = (i - k + 1) % n;
            end = i % n;
        }
    }
 
    cout << "max circular sum = "
         << ans << endl;
    cout << "start index = " << start
         << "\nend index = " << end << endl;
}
 
// Driver Code
int main()
{
    int arr[] = { 18, 4, 3, 4, 5, 6, 7, 8, 2, 10 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 3;
 
    maxCircularSum(arr, n, k);
    return 0;
}


Java




// Java program to find maximum circular
// subarray sum of size k
 
import java.util.*;
 
class GFG
{
 
    // Function to calculate
    // maximum sum
    static void maxCircularSum(int[] arr, int n, int k)
    {
 
        // k must be greater
        if (n < k)
        {
            System.out.println("Invalid");
            return;
        }
 
        int sum = 0, start = 0, end = k - 1;
 
        // calculate the sum of first k elements.
        for (int i = 0; i < k; i++)
            sum += arr[i];
 
        int ans = sum;
 
        for (int i = k; i < n + k; i++)
        {
 
            // add current element to sum
            // and subtract the first element
            // of the previous window.
            sum += arr[i % n] - arr[(i - k) % n];
 
            if (sum > ans)
            {
                ans = sum;
                start = (i - k + 1) % n;
                end = i % n;
            }
        }
 
        System.out.println("max circular sum = " + ans);
        System.out.println("start index = " + start + "\nend index = " + end);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int[] arr = { 18, 4, 3, 4, 5, 6, 7, 8, 2, 10 };
        int n = arr.length;
        int k = 3;
 
        maxCircularSum(arr, n, k);
    }
}
 
// This code is contributed by
// sanjeev2552


Python3




# Python3 program to find maximum circular
# subarray sum of size k
 
# Function to calculate
# maximum sum
def maxCircularSum(arr, n, k) :
 
    # k must be greater
    if (n < k) :
        print("Invalid");
        return;
 
    sum = 0; start = 0; end = k - 1;
 
    # calculate the sum of first k elements.
    for i in range(k) :
        sum += arr[i];
 
    ans = sum;
 
    for i in range(k, n + k) :
 
        # add current element to sum
        # and subtract the first element
        # of the previous window.
        sum += arr[i % n] - arr[(i - k) % n];
 
        if (sum > ans) :
            ans = sum;
            start = (i - k + 1) % n;
            end = i % n;
 
    print("max circular sum = ",ans);
    print("start index = ", start,
          "\nend index = ", end);
 
# Driver Code
if __name__ == "__main__" :
 
    arr = [ 18, 4, 3, 4, 5, 6, 7, 8, 2, 10 ];
    n = len(arr);
    k = 3;
 
    maxCircularSum(arr, n, k);
 
# This code is contributed by AnkitRai01


C#




// C# program to find maximum circular
// subarray sum of size k
using System;
 
class GFG
{
 
    // Function to calculate
    // maximum sum
    static void maxCircularSum(int[] arr,
                               int n, int k)
    {
 
        // k must be greater
        if (n < k)
        {
            Console.WriteLine("Invalid");
            return;
        }
 
        int sum = 0, start = 0, end = k - 1;
 
        // calculate the sum of first k elements.
        for (int i = 0; i < k; i++)
            sum += arr[i];
 
        int ans = sum;
 
        for (int i = k; i < n + k; i++)
        {
 
            // add current element to sum
            // and subtract the first element
            // of the previous window.
            sum += arr[i % n] - arr[(i - k) % n];
 
            if (sum > ans)
            {
                ans = sum;
                start = (i - k + 1) % n;
                end = i % n;
            }
        }
 
        Console.WriteLine("max circular sum = " + ans);
        Console.WriteLine("start index = " + start +
                          "\nend index = " + end);
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        int[] arr = { 18, 4, 3, 4, 5,
                      6, 7, 8, 2, 10 };
        int n = arr.Length;
        int k = 3;
 
        maxCircularSum(arr, n, k);
    }
}
 
// This code is contributed by 29AjayKumar


Javascript




<script>
 
// Javascript program to find maximum circular
// subarray sum of size k
 
// Function to calculate
// maximum sum
function maxCircularSum(arr, n, k)
{
     
    // k must be greater
    if (n < k)
    {
        document.write("Invalid");
        return;
    }
 
    let sum = 0, start = 0, end = k - 1;
 
    // Calculate the sum of first k elements.
    for(let i = 0; i < k; i++)
    {
        sum += arr[i];
    }
 
    let ans = sum;
 
    for(let i = k; i < n + k; i++)
    {
         
        // Add current element to sum
        // and subtract the first element
        // of the previous window.
        sum += arr[i % n] - arr[(i - k) % n];
 
        if (sum > ans)
        {
            ans = sum;
            start = (i - k + 1) % n;
            end = i % n;
        }
    }
 
    document.write("max circular sum = " +
                   ans + "<br>");
    document.write("start index = " + start +
                   "<br>end index = " + end +
                   "<br>");
}
 
// Driver Code
let arr = [ 18, 4, 3, 4, 5,
            6, 7, 8, 2, 10 ];
let n = arr.length
let k = 3;
 
maxCircularSum(arr, n, k);
 
// This code is contributed by _saurabh_jaiswal
 
</script>


Output: 

max circular sum = 32
start index = 9
end index = 1

 

Time Complexity:O(N)
Auxiliary Space: O(1), no extra space is required, so it is a constant.

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

RELATED ARTICLES

Most Popular

Recent Comments