Find the maximum sum of lengths of non-overlapping subarrays (contiguous elements) with k as the maximum element.
Examples:
Input : arr[] = {2, 1, 4, 9, 2, 3, 8, 3, 4}
k = 4
Output : 5
{2, 1, 4} => Length = 3
{3, 4} => Length = 2
So, 3 + 2 = 5 is the answer
Input : arr[] = {1, 2, 3, 2, 3, 4, 1}
k = 4
Output : 7
{1, 2, 3, 2, 3, 4, 1} => Length = 7
Input : arr = {4, 5, 7, 1, 2, 9, 8, 4, 3, 1}
k = 4
Ans = 4
{4} => Length = 1
{4, 3, 1} => Length = 3
So, 1 + 3 = 4 is the answer
Question source : https://www.geeksforgeeks.org/amazon-interview-experience-set-376-campus-internship/
Algorithm :
Traverse the array starting from first element
Take a loop and keep on incrementing count
If element is less than equal to k
if array element is equal to k, then mark
a flag
If flag is marked, add this count to answer
Take another loop and traverse the array
till element is greater than k
return ans
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int calculateMaxSumLength( int arr[], int n, int k)
{
int ans = 0;
int count = 0;
int flag = 0;
for ( int i = 0; i < n;) {
count = 0;
flag = 0;
while (arr[i] <= k && i < n) {
count++;
if (arr[i] == k)
flag = 1;
i++;
}
if (flag == 1)
ans += count;
while (arr[i] > k && i < n)
i++;
}
return ans;
}
int main()
{
int arr[] = { 4, 5, 7, 1, 2, 9, 8, 4, 3, 1 };
int size = sizeof (arr) / sizeof (arr[0]);
int k = 4;
int ans = calculateMaxSumLength(arr, size, k);
cout << "Max Length :: " << ans << endl;
return 0;
}
|
Java
public class GFG
{
static int calculateMaxSumLength( int arr[], int n, int k) {
int ans = 0 ;
int count = 0 ;
int flag = 0 ;
for ( int i = 0 ; i < n;) {
count = 0 ;
flag = 0 ;
while (i < n && arr[i] <= k) {
count++;
if (arr[i] == k)
flag = 1 ;
i++;
}
if (flag == 1 )
ans += count;
while (i < n && arr[i] > k)
i++;
}
return ans;
}
public static void main(String[] args) {
int arr[] = { 4 , 5 , 7 , 1 , 2 , 9 , 8 , 4 , 3 , 1 };
int size = arr.length;
int k = 4 ;
int ans = calculateMaxSumLength(arr, size, k);
System.out.println( "Max Length :: " + ans);
}
}
|
Python3
def calculateMaxSumLength(arr, n, k):
ans = 0
i = 0
while i < n :
count = 0
flag = 0
while i < n and arr[i] < = k :
count = count + 1
if arr[i] = = k:
flag = 1
i = i + 1
if flag = = 1 :
ans = ans + count
while i < n and arr[i] > k :
i = i + 1
return ans
arr = [ 4 , 5 , 7 , 1 , 2 , 9 , 8 , 4 , 3 , 1 ]
size = len (arr)
k = 4
ans = calculateMaxSumLength(arr, size, k)
print ( "Max Length ::" ,ans)
|
C#
using System;
class GFG {
static int calculateMaxSumLength( int []arr,
int n,
int k)
{
int ans = 0;
int count = 0;
int flag = 0;
for ( int i = 0; i < n;)
{
count = 0;
flag = 0;
while (i < n && arr[i] <= k)
{
count++;
if (arr[i] == k)
flag = 1;
i++;
}
if (flag == 1)
ans += count;
while (i < n && arr[i] > k)
i++;
}
return ans;
}
public static void Main()
{
int []arr = {4, 5, 7, 1, 2, 9, 8, 4, 3, 1};
int size = arr.Length;
int k = 4;
int ans = calculateMaxSumLength(arr, size, k);
Console.WriteLine( "Max Length :: " + ans);
}
}
|
PHP
<?php
function calculateMaxSumLength(& $arr , $n , $k )
{
$ans = 0;
$count = 0;
$flag = 0;
for ( $i = 0; $i < $n 😉
{
$count = 0;
$flag = 0;
while ( $arr [ $i ] <= $k && $i < $n )
{
$count ++;
if ( $arr [ $i ] == $k )
$flag = 1;
$i ++;
}
if ( $flag == 1)
$ans += $count ;
while ( $arr [ $i ] > $k && $i < $n )
$i ++;
}
return $ans ;
}
$arr = array ( 4, 5, 7, 1, 2,
9, 8, 4, 3, 1 );
$size = sizeof( $arr );
$k = 4;
$ans = calculateMaxSumLength( $arr , $size , $k );
echo "Max Length :: " . $ans . "\n" ;
?>
|
Javascript
<script>
function calculateMaxSumLength(arr,n,k)
{
let ans = 0;
let count = 0;
let flag = 0;
for (let i = 0; i < n;) {
count = 0;
flag = 0;
while (i < n && arr[i] <= k) {
count++;
if (arr[i] == k)
flag = 1;
i++;
}
if (flag == 1)
ans += count;
while (i < n && arr[i] > k)
i++;
}
return ans;
}
let arr=[4, 5, 7, 1, 2, 9, 8, 4, 3, 1];
let size = arr.length;
let k = 4;
let ans = calculateMaxSumLength(arr, size, k);
document.write( "Max Length :: " + ans);
</script>
|
Time Complexity: O(n), It may look like O(n2), but if you take a closer look, array is traversed only once
Auxiliary Space: O(1)
Another approach:
Algorithm:
Traverse the array from first element to last element
if the element is less than k increment the count
if the element is equals to k
if k is not found
increment the count and mark flag as 1
if k is found
add the value of count to ans and mark count as 1
if the element is greater than k
if k is present in the subarray add the value of count to ans and
assign value of count and flag variables as 0
finally check again if k value is found in subarray or not
if k is found return sum of answer and count
if not return ans
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int calculateMaxSumLength( int arr[], int n, int k)
{
int ans = 0;
int count = 0;
int flag = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] < k) {
count++;
}
else if (arr[i] == k) {
if (flag == 0) {
count++;
flag = 1;
}
else {
ans += count;
count = 1;
}
}
else {
if (flag == 1) {
ans += count;
}
count = 0;
flag = 0;
}
}
if (flag == 1) {
return ans + count;
}
return ans;
}
int main()
{
int arr[] = { 4, 5, 7, 1, 2, 9, 8, 4, 3, 1 };
int size = sizeof (arr) / sizeof (arr[0]);
int k = 4;
int ans = calculateMaxSumLength(arr, size, k);
cout << "Max Length :: " << ans << endl;
return 0;
}
|
Java
class GFG {
static int calculateMaxSumLength( int arr[], int n,
int k)
{
int ans = 0 ;
int count = 0 ;
int flag = 0 ;
for ( int i = 0 ; i < n; i++) {
if (arr[i] < k) {
count++;
}
else if (arr[i] == k) {
if (flag == 0 ) {
count++;
flag = 1 ;
}
else {
ans += count;
count = 1 ;
}
}
else {
if (flag == 1 ) {
ans += count;
}
count = 0 ;
flag = 0 ;
}
}
if (flag == 1 ) {
return ans + count;
}
return ans;
}
public static void main(String[] args)
{
int arr[] = { 4 , 5 , 7 , 1 , 2 , 9 , 8 , 4 , 3 , 1 };
int size = arr.length;
int k = 4 ;
int ans = calculateMaxSumLength(arr, size, k);
System.out.println( "Max Length :: " + ans);
}
}
|
Python3
def calculateMaxSumLength(arr, n, k):
ans = 0
count = 0
flag = 0
for i in range (n):
if arr[i] < k:
count = count + 1
elif arr[i] = = k:
if flag = = 0 :
count = count + 1
flag = 1
else :
ans = ans + count
count = 1
else :
if flag = = 1 :
ans = ans + count
count = 0
flag = 0
if flag = = 1 :
return ans + count
return ans
arr = [ 4 , 5 , 7 , 1 , 2 , 9 , 8 , 4 , 3 , 1 ]
size = len (arr)
k = 4
ans = calculateMaxSumLength(arr, size, k)
print ( "Max Length ::" , ans)
|
C#
using System;
class GFG
{
static int calculateMaxSumLength( int [] arr, int n, int k)
{
int ans = 0;
int count = 0;
int flag = 0;
for ( int i = 0; i < n; i++)
{
if (arr[i] < k)
{
count++;
}
else if (arr[i] == k)
{
if (flag == 0)
{
count++;
flag = 1;
}
else
{
ans += count;
count = 1;
}
}
else
{
if (flag == 1)
{
ans += count;
}
count = 0;
flag = 0;
}
}
if (flag == 1)
{
return ans + count;
}
return ans;
}
public static void Main()
{
int []arr = {4, 5, 7, 1, 2, 9, 8, 4, 3, 1};
int size = arr.Length;
int k = 4;
int ans = calculateMaxSumLength(arr, size, k);
Console.WriteLine( "Max Length :: " + ans);
}
}
|
Javascript
<script>
function calculateMaxSumLength(arr, n, k)
{
let ans = 0;
let count = 0;
let flag = 0;
for (let i = 0; i < n; i++)
{
if (arr[i] < k) {
count++;
}
else if (arr[i] == k) {
if (flag == 0) {
count++;
flag = 1;
}
else {
ans += count;
count = 1;
}
}
else
{
if (flag == 1)
{
ans += count;
}
count = 0;
flag = 0;
}
}
if (flag == 1) {
return ans + count;
}
return ans;
}
let arr = [ 4, 5, 7, 1, 2, 9, 8, 4, 3, 1 ];
let size = arr.length;
let k = 4;
let ans = calculateMaxSumLength(arr, size, k);
document.write( "Max Length :: " ,ans, "</br>" );
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)