Open In App

Split array into minimum number of subsets having difference between maximum and minimum element at most K

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:

Below is the implementation of the above approach:




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the minimum number
// of sets the array can be divided such
// that for each set max-min <= K
int minSetCount(int arr[], int N, int K)
{
    // Sort the input array
    sort(arr, arr + N);
 
    // Stores the count of set required
    int setCount = 1;
 
    // Stores the beginning and ending
    // of the current set
    int begin = 0, end = 0;
 
    // Loop to iterate over the array
    while (end < N) {
 
        // If arr[end] can be included
        // in the current set else
        // begin a new set
        if (arr[end] - arr[begin] <= K) {
            end++;
        }
        else {
            // Increment the set count
            setCount++;
            begin = end;
        }
    }
 
    // Return answer
    return setCount;
}
 
// Driver Code
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 program for the above approach
 
import java.util.*;
 
class GFG {
 
    // Function to find the minimum number
    // of sets the array can be divided such
    // that for each set max-min <= K
    static int minSetCount(int[] arr, int N, int K)
    {
        // Sort the input array
        Arrays.sort(arr);
 
        // Stores the count of set required
        int setCount = 1;
 
        // Stores the beginning and ending
        // of the current set
        int begin = 0, end = 0;
 
        // Loop to iterate over the array
        while (end < N) {
 
            // If arr[end] can be included
            // in the current set else
            // begin a new set
            if (arr[end] - arr[begin] <= K) {
                end++;
            }
            else {
                // Increment the set count
                setCount++;
                begin = end;
            }
        }
 
        // Return answer
        return setCount;
    }
 
    // Driver Code
    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));
    }
}
 
// This code is contributed by subham348.




# Python 3 program for the above approach
 
# Function to find the minimum number
# of sets the array can be divided such
# that for each set max-min <= K
def minSetCount(arr, N, K):
    # Sort the input array
    arr.sort()
 
    # Stores the count of set required
    setCount = 1
 
    # Stores the beginning and ending
    # of the current set
    begin = 0
    end = 0
 
    # Loop to iterate over the array
    while (end < N):
       
        # If arr[end] can be included
        # in the current set else
        # begin a new set
        if (arr[end] - arr[begin] <= K):
            end += 1
        else:
            # Increment the set count
            setCount += 1
            begin = end
 
    # Return answer
    return setCount
 
# Driver Code
if __name__ == '__main__':
    arr = [5, 2, 9, 7, 3, 2, 4, 6, 14, 10]
    N = len(arr)
    K = 3
    print(minSetCount(arr, N, K))
 
    # This code is contributed by SURENDRA_GANGWAR.




// C# program for the above approach
using System;
 
public class GFG
{
 
    // Function to find the minimum number
    // of sets the array can be divided such
    // that for each set max-min <= K
    static int minSetCount(int[] arr, int N, int K)
    {
       
        // Sort the input array
        Array.Sort(arr);
 
        // Stores the count of set required
        int setCount = 1;
 
        // Stores the beginning and ending
        // of the current set
        int begin = 0, end = 0;
 
        // Loop to iterate over the array
        while (end < N) {
 
            // If arr[end] can be included
            // in the current set else
            // begin a new set
            if (arr[end] - arr[begin] <= K) {
                end++;
            }
            else {
                // Increment the set count
                setCount++;
                begin = end;
            }
        }
 
        // Return answer
        return setCount;
    }
 
    // Driver Code
    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));
    }
}
 
// This code is contributed by AnkThon




<script>
        // JavaScript Program to implement
        // the above approach
 
 
        // Function to find the minimum number
        // of sets the array can be divided such
        // that for each set max-min <= K
        function minSetCount(arr, N, K) {
            // Sort the input array
            arr.sort(function (a, b) { return a - b })
 
            // Stores the count of set required
            let setCount = 1;
 
            // Stores the beginning and ending
            // of the current set
            let begin = 0, end = 0;
 
            // Loop to iterate over the array
            while (end < N) {
 
                // If arr[end] can be included
                // in the current set else
                // begin a new set
                if (arr[end] - arr[begin] <= K) {
                    end++;
                }
                else {
                    // Increment the set count
                    setCount++;
                    begin = end;
                }
            }
 
            // Return answer
            return setCount;
        }
 
        // Driver Code
        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));
 
// This code is contributed by Potta Lokesh
 
    </script>

Output: 
4

 

Time Complexity: O(N*log N)
Auxiliary Space: O(1)


Article Tags :