Longest Subarray with sum differences ≤ K
Last Updated :
07 Aug, 2023
Given a sorted array arr[] of size N, the task is to find the length of the longest subarray and print the subarray such that the sum of the differences of the maximum element of the chosen subarray with all other elements of that same subarray is
≤ K.i.e. ∑(amax-ai) ≤ K, for that given subarray.
Examples:
Input: N = 5, arr[] = {1, 4, 5, 6, 10}, K = 4
Output: 3
4 5 6
Explanation: The subarray is having the difference (6-4)+(6-5)+(6-6)= 2+1+0=3 which is of the longest length.
Input: N = 5, arr[] = {2, 4, 5, 10, 28}, K = 20
Output: 4
2 4 5 10
Explanation: The subarray is having the difference (10-2)+(10-4)+(10-5)+(10-10) = 8+6+5+0 = 19 which is of the longest length.
Approach: To solve the problem follow the below idea:
We can generate all the subarray and check the difference of the maximum element of the subarray with all other elements of that same subarray and keep updating the subarray with the maximum length
Follow the below steps to solve the problem:
- Iterate through the array by maintaining 2 pointers which denote the starting and ending point of that subarray
- Then Iterate through the chosen subarray and check whether the difference as stated above is ≤ K
- If our required condition matches, then we simply update our max answer.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findLongestSubarray( int arr[], int n, int k)
{
int ans = INT_MIN;
int l = 0;
int r = n - 1;
for ( int i = 0; i < n; i++) {
for ( int j = i; j < n; j++) {
int diff_sum = 0;
for ( int k = j; k >= i; k--) {
diff_sum += abs (arr[j] - arr[k]);
}
if (diff_sum <= k) {
ans = max(ans, j - i + 1);
if (ans == diff_sum) {
l = i;
r = j;
}
}
}
}
cout << ans << endl;
for ( int i = l; i <= r; i++) {
cout << arr[i] << " " ;
}
cout << endl;
}
int main()
{
int arr1[] = { 1, 4, 5, 6, 10 };
int n = sizeof (arr1) / sizeof ( int );
int K = 4;
findLongestSubarray(arr1, n, K);
int arr2[] = { 2, 4, 5, 10, 28 };
K = 20;
findLongestSubarray(arr2, n, K);
return 0;
}
|
Java
import java.util.Arrays;
class GFG {
static void findLongestSubarray( int [] arr, int n, int k) {
int ans = Integer.MIN_VALUE;
int l = 0 ;
int r = n - 1 ;
for ( int i = 0 ; i < n; i++) {
for ( int j = i; j < n; j++) {
int diff_sum = 0 ;
for ( int p = j; p >= i; p--) {
diff_sum += Math.abs(arr[j] - arr[p]);
}
if (diff_sum <= k) {
ans = Math.max(ans, j - i + 1 );
if (ans == diff_sum) {
l = i;
r = j;
}
}
}
}
System.out.println(ans);
for ( int i = l; i <= r; i++) {
System.out.print(arr[i] + " " );
}
System.out.println();
}
public static void main(String[] args) {
int [] arr1 = { 1 , 4 , 5 , 6 , 10 };
int n = arr1.length;
int K = 4 ;
findLongestSubarray(arr1, n, K);
int [] arr2 = { 2 , 4 , 5 , 10 , 28 };
K = 20 ;
findLongestSubarray(arr2, n, K);
}
}
|
Python3
def find_longest_subarray(arr, n, k):
ans = float ( '-inf' )
l = 0
r = n - 1
for i in range (n):
for j in range (i, n):
diff_sum = 0
for x in range (j, i - 1 , - 1 ):
diff_sum + = abs (arr[j] - arr[x])
if diff_sum < = k:
ans = max (ans, j - i + 1 )
if ans = = diff_sum:
l = i
r = j
print (ans)
for i in range (l, r + 1 ):
print (arr[i], end = " " )
print ()
def main():
arr1 = [ 1 , 4 , 5 , 6 , 10 ]
n = len (arr1)
k = 4
find_longest_subarray(arr1, n, k)
arr2 = [ 2 , 4 , 5 , 10 , 28 ]
k = 20
find_longest_subarray(arr2, n, k)
main()
|
C#
using System;
class Program
{
static void FindLongestSubarray( int [] arr, int n, int k)
{
int ans = int .MinValue;
int l = 0;
int r = n - 1;
for ( int i = 0; i < n; i++)
{
for ( int j = i; j < n; j++)
{
int diffSum = 0;
for ( int x = j; x >= i; x--)
{
diffSum += Math.Abs(arr[j] - arr[x]);
}
if (diffSum <= k)
{
ans = Math.Max(ans, j - i + 1);
if (ans == diffSum)
{
l = i;
r = j;
}
}
}
}
Console.WriteLine(ans);
for ( int i = l; i <= r; i++)
{
Console.Write(arr[i] + " " );
}
Console.WriteLine();
}
static void Main()
{
int [] arr1 = { 1, 4, 5, 6, 10 };
int n = arr1.Length;
int k = 4;
FindLongestSubarray(arr1, n, k);
int [] arr2 = { 2, 4, 5, 10, 28 };
k = 20;
FindLongestSubarray(arr2, n, k);
}
}
|
Javascript
function findLongestSubarray(arr, n, k) {
let ans = Number.MIN_SAFE_INTEGER;
let l = 0;
let r = n - 1;
for (let i = 0; i < n; i++) {
for (let j = i; j < n; j++) {
let diff_sum = 0;
for (let k = j; k >= i; k--) {
diff_sum += Math.abs(arr[j] - arr[k]);
}
if (diff_sum <= k) {
ans = Math.max(ans, j - i + 1);
if (ans === diff_sum) {
l = i;
r = j;
}
}
}
}
console.log(ans);
for (let i = l; i <= r; i++) {
console.log(arr[i] + " " );
}
console.log();
}
let arr1 = [1, 4, 5, 6, 10];
let n = arr1.length;
let K = 4;
findLongestSubarray(arr1, n, K);
let arr2 = [2, 4, 5, 10, 28];
let n2 = arr2.length;
let K2 = 20;
findLongestSubarray(arr2, n2, K2);
|
Time Complexity: O(N3)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...