Given an array arr[] and an integer K, the task is to find the first subarray which has a sum greater than or equal to half of the maximum possible sum from any subarray of size K.
Examples:
Input: arr[] = {2, 4, 5, 1, 4, 6, 6, 2, 1, 0}, K = 3
Output: 6 2 1
Explanation:
The given array has a maximum possible sum from any subarray of size K is 16 from the subarray {4, 6, 6}.
So, the required subarray sum should be greater than or equal to 8
{6, 2, 1} is the first subarray which has a sum of 9 which is greater than 8.Input: arr[] = {12, 45, 11, 10, 8, 56, 2}, K = 4
Output: 45 11 10
Approach: This problem can be solved using the sliding windows technique because subarrays are to be taken into consideration. Follow the steps below to solve this problem:
- Calculate the sum of all subarrays of size K and store them in an array.
- Now, find the maximum of all the sums.
- Iterate over the array and find a sum that is greater than or equal to half of the maximum subarray sum obtained above.
- Print the subarray satisfying the above condition.
Below is the implementation of the above approach:
C++
// C++ implementation of the above approach#include <bits/stdc++.h>#include <iostream>using namespace std;// Function to print the subarray with sum// greater or equal than the half of// the maximum subarray sum of K sizevoid subArray(int arr[], int n, int k){ int sum = 0; // Storing sum of first subarray for (int i = 0; i < k; i++) { sum += arr[i]; } // Vector to store the // subarray sums vector<int> res; res.push_back(sum); // Sliding window technique to // Find sum of subarrays of size K for (int i = k; i < n; i++) { sum -= arr[i - k]; sum += arr[i]; res.push_back(sum); } // Maximum sub-array sum int max_sum = *max_element(res.begin(), res.end()); int half = max_sum / 2; // Create a copy vector vector<int> copy = res; // Sort the vector sort(copy.begin(),copy.end()); int half_index, half_sum; // Check in a sorted array for // an element exceeding // half of the max_sum for (auto x : copy) { if (x >= half) { half_sum = x; break; } } // Calculate index of first // subarray having required sum for (int x = 0; x < res.size(); x++) { if (res[x] == half_sum) { half_index = x; break; } } // Print the subarray for (int i = 1; i <= k; i++) { cout << arr[half_index + i - 1] << " "; }}// Driver Codeint main(){ // Given array int arr[] = { 2, 4, 5, 1, 4, 6, 6, 2, 1, 0 }; int k = 3; int n = sizeof(arr) / sizeof(arr[0]); // Function Call subArray(arr, n, k); return 0;}// This code is contributed by akshitdiwan05 |
Java
// Java implementation of // the above approachimport java.util.*;class GFG{// Function to print the subarray with sum// greater or equal than the half of// the maximum subarray sum of K sizestatic void subArray(int arr[], int n, int k){ int sum = 0; // Storing sum of first subarray for (int i = 0; i < k; i++) { sum += arr[i]; } // Vector to store the // subarray sums Vector<Integer> res = new Vector<>(); res.add(sum); // Sliding window technique to // Find sum of subarrays of size K for (int i = k; i < n; i++) { sum -= arr[i - k]; sum += arr[i]; res.add(sum); } // Maximum sub-array sum int max_sum = res.elementAt(0); for(int i =0; i < res.size(); i++) { if(max_sum < res.elementAt(i)) { max_sum = res.elementAt(i); } } int half = max_sum / 2; // Create a copy vector Vector<Integer> copy = new Vector<>(res); // Sort the vector Collections.sort(copy); int half_index = 0, half_sum = 0; // Check in a sorted array for // an element exceeding // half of the max_sum for (int x = 0; x < copy.size(); x++) { if (copy.elementAt(x) >= half) { half_sum = copy.elementAt(x); break; } } // Calculate index of first // subarray having required sum for (int x = 0; x < res.size(); x++) { if (res.elementAt(x) == half_sum) { half_index = x; break; } } // Print the subarray for (int i = 1; i <= k; i++) { System.out.print( arr[half_index + i - 1] + " "); }}// Driver Codepublic static void main(String[] args){ // Given array int arr[] = {2, 4, 5, 1, 4, 6, 6, 2, 1, 0}; int k = 3; int n = arr.length; // Function Call subArray(arr, n, k);}}// This code is contributed by gauravrajput1 |
Python3
# Python 3 implementation # of the above approach# Function to print the # subarray with sum greater # or equal than the half of# the maximum subarray # sum of K sizedef subArray(arr, n, k): sum = 0 # Storing sum of # first subarray for i in range (k): sum += arr[i] # Vector to store the # subarray sums res = [] res.append(sum) # Sliding window technique # to find sum of subarrays # of size K for i in range (k, n): sum -= arr[i - k] sum += arr[i] res.append(sum) # Maximum sub-array sum max_sum = max(res) half = max_sum // 2 # Create a copy vector copy = res.copy() # Sort the vector copy.sort() # Check in a sorted array for # an element exceeding # half of the max_sum for x in copy: if (x >= half): half_sum = x break # Calculate index of first # subarray having required sum for x in range (len(res)): if (res[x] == half_sum): half_index = x break # Print the subarray for i in range (1, k + 1): print (arr[half_index + i - 1] , end = " ")# Driver Codeif __name__ == "__main__": # Given array arr = [2, 4, 5, 1, 4, 6, 6, 2, 1, 0] k = 3 n = len(arr) # Function Call subArray(arr, n, k);# This code is contributed by Chitranayal |
C#
// C# implementation of // the above approachusing System;using System.Collections.Generic;class GFG{// Function to print the subarray with sum// greater or equal than the half of// the maximum subarray sum of K sizestatic void subArray(int []arr, int n, int k){ int sum = 0; // Storing sum of first subarray for(int i = 0; i < k; i++) { sum += arr[i]; } // List to store the // subarray sums List<int> res = new List<int>(); res.Add(sum); // Sliding window technique to // Find sum of subarrays of size K for(int i = k; i < n; i++) { sum -= arr[i - k]; sum += arr[i]; res.Add(sum); } // Maximum sub-array sum int max_sum = res[0]; for(int i = 0; i < res.Count; i++) { if (max_sum < res[i]) { max_sum = res[i]; } } int half = max_sum / 2; // Create a copy vector List<int> copy = new List<int>(res); // Sort the vector copy.Sort(); int half_index = 0, half_sum = 0; // Check in a sorted array for // an element exceeding // half of the max_sum for(int x = 0; x < copy.Count; x++) { if (copy[x] >= half) { half_sum = copy[x]; break; } } // Calculate index of first // subarray having required sum for(int x = 0; x < res.Count; x++) { if (res[x] == half_sum) { half_index = x; break; } } // Print the subarray for(int i = 1; i <= k; i++) { Console.Write( arr[half_index + i - 1] + " "); }}// Driver Codepublic static void Main(String[] args){ // Given array int []arr = { 2, 4, 5, 1, 4, 6, 6, 2, 1, 0 }; int k = 3; int n = arr.Length; // Function call subArray(arr, n, k);}}// This code is contributed by Amit Katiyar |
Javascript
<script>// javascript implementation of // the above approach// Creating the bblSort function function bblSort(arr){ for(var i = 0; i < arr.length; i++){ // Last i elements are already in place for(var j = 0; j < ( arr.length - i -1 ); j++){ // Checking if the item at present iteration // is greater than the next iteration if(arr[j] > arr[j+1]){ // If the condition is true then swap them var temp = arr[j] arr[j] = arr[j + 1] arr[j+1] = temp } } } // Print the sorted array return arr;} // Function to print the subarray with sum // greater or equal than the half of // the maximum subarray sum of K size function subArray(arr , n , k) { var sum = 0; // Storing sum of first subarray for (i = 0; i < k; i++) { sum += arr[i]; } // Vector to store the // subarray sums var res =[]; res.push(sum); // Sliding window technique to // Find sum of subarrays of size K for (i = k; i < n; i++) { sum -= arr[i - k]; sum += arr[i]; res.push(sum); } // Maximum sub-array sum var max_sum = res[0]; for (i = 0; i < res.length; i++) { if (max_sum < res[i]) { max_sum = res[i]; } } var half = max_sum / 2; // Create a copy vector var copy = Array(res.length).fill(0);for (i = 0; i < res.length; i++) copy[i] = res[i]; // Sort the vector copy = bblSort(copy); var half_index = 0, half_sum = 0; // Check in a sorted array for // an element exceeding // half of the max_sum for (x = 0; x < copy.length; x++) { if (copy[x] >= half) { half_sum = copy[x]; break; } } // Calculate index of first // subarray having required sum for (x = 0; x < res.length; x++) { if (res[x] == half_sum) { half_index = x; break; } } // Print the subarray for (i = 1; i <= k; i++) { document.write(arr[half_index + i - 1] + " "); } } // Driver Code // Given array var arr = [ 2, 4, 5, 1, 4, 6, 6, 2, 1, 0 ]; var k = 3; var n = arr.length; // Function Call subArray(arr, n, k);// This code is contributed by todaysgaurav</script> |
6 2 1
Time complexity: O(NlogN)
Space Complexity: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Find More here to that Topic: geeksforgeeks.org/first-subarray-having-sum-at-least-half-the-maximum-sum-of-any-subarray-of-size-k/ […]
… [Trackback]
[…] Find More Info here to that Topic: geeksforgeeks.org/first-subarray-having-sum-at-least-half-the-maximum-sum-of-any-subarray-of-size-k/ […]