Split array into minimum number of subsets having difference between maximum and minimum element at most K
Last Updated :
22 Sep, 2021
Given an array arr[] consisting of N integers and an integer K, the task is to find the minimum number of sets, the array elements can be divided into such that the difference between the maximum and minimum element of each set is at most K.
Examples:
Input: arr[] = {1, 2, 3, 4, 5}, K = 2
Output: 2
Explanation:
The given array can be divided into two sets {1, 2, 3} having the difference between maximum and minimum as 3 – 1= 2 and {4, 5} having the difference between maximum and minimum as 5 – 4 = 1.
Input: arr[] = {5, 2, 9, 7, 3, 2, 4, 6, 14, 10}, K = 3
Output: 4
Approach: The given problem can be solved by sorting the given array and finding the minimum number of subarrays the array elements can be broken such that the difference between the maximum and minimum element at most K. Follow the steps below to solve the given problem:
- Sort the given array arr[] in non-decreasing order.
- Initialize two iterators begin and end as 0 representing the beginning and end of each set.
- Initialize a variable, say setCount as 1 that stores the resultant minimum number of breaking of array elements into subarrays.
- Iterate a loop until the value of end is less than N and perform the following steps:
- If the value of arr[end] – arr[begin] <= K, then increment the value of end.
- Otherwise, increment the value setCount by 1 and update the value of begin to end representing the new set.
- After completing the above steps, print the value of setCount as the result.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minSetCount( int arr[], int N, int K)
{
sort(arr, arr + N);
int setCount = 1;
int begin = 0, end = 0;
while (end < N) {
if (arr[end] - arr[begin] <= K) {
end++;
}
else {
setCount++;
begin = end;
}
}
return setCount;
}
int main()
{
int arr[] = { 5, 2, 9, 7, 3, 2, 4, 6, 14, 10 };
int N = sizeof (arr) / sizeof ( int );
int K = 3;
cout << minSetCount(arr, N, K);
return 0;
}
|
Java
import java.util.*;
class GFG {
static int minSetCount( int [] arr, int N, int K)
{
Arrays.sort(arr);
int setCount = 1 ;
int begin = 0 , end = 0 ;
while (end < N) {
if (arr[end] - arr[begin] <= K) {
end++;
}
else {
setCount++;
begin = end;
}
}
return setCount;
}
public static void main(String[] args)
{
int [] arr = { 5 , 2 , 9 , 7 , 3 , 2 , 4 , 6 , 14 , 10 };
int N = arr.length;
int K = 3 ;
System.out.print(minSetCount(arr, N, K));
}
}
|
Python3
def minSetCount(arr, N, K):
arr.sort()
setCount = 1
begin = 0
end = 0
while (end < N):
if (arr[end] - arr[begin] < = K):
end + = 1
else :
setCount + = 1
begin = end
return setCount
if __name__ = = '__main__' :
arr = [ 5 , 2 , 9 , 7 , 3 , 2 , 4 , 6 , 14 , 10 ]
N = len (arr)
K = 3
print (minSetCount(arr, N, K))
|
C#
using System;
public class GFG
{
static int minSetCount( int [] arr, int N, int K)
{
Array.Sort(arr);
int setCount = 1;
int begin = 0, end = 0;
while (end < N) {
if (arr[end] - arr[begin] <= K) {
end++;
}
else {
setCount++;
begin = end;
}
}
return setCount;
}
public static void Main( string [] args)
{
int [] arr = { 5, 2, 9, 7, 3, 2, 4, 6, 14, 10 };
int N = arr.Length;
int K = 3;
Console.WriteLine(minSetCount(arr, N, K));
}
}
|
Javascript
<script>
function minSetCount(arr, N, K) {
arr.sort( function (a, b) { return a - b })
let setCount = 1;
let begin = 0, end = 0;
while (end < N) {
if (arr[end] - arr[begin] <= K) {
end++;
}
else {
setCount++;
begin = end;
}
}
return setCount;
}
let arr = [5, 2, 9, 7, 3, 2, 4, 6, 14, 10];
let N = arr.length;
let K = 3;
document.write(minSetCount(arr, N, K));
</script>
|
Time Complexity: O(N*log N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...