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++
// 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 <= Kint 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 Codeint 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
// 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. |
Python3
# 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 <= Kdef 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 Codeif __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#
// C# program for the above approachusing 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 |
Javascript
<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> |
4
Â
Time Complexity: O(N*log N)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
