Minimum swaps required to bring all elements less than or equal to k together

Given an array of n positive integers and a number k. Find the minimum number of swaps required to bring all the numbers less than or equal to k together.

Input:  arr[] = {2, 1, 5, 6, 3}, k = 3
Output: 1

Explanation: 
To bring elements 2, 1, 3 together, swap 
element '5' with '3' such that final array
will be-
arr[] = {2, 1, 3, 6, 5}

Input:  arr[] = {2, 7, 9, 5, 8, 7, 4}, k = 5
Output: 2

A simple solution is to first count all elements less than or equals to k(say ‘good’). Now traverse for every sub-array and swap those elements whose value is greater than k. Time complexity of this approach is O(n2)

A simple approach is to use two pointer technique and sliding window.



  1. Find count of all elements which are less than or equals to ‘k’. Let’s say the count is ‘cnt’
  2. Using two pointer technique for window of length ‘cnt’, each time keep track of how many elements in this range are greater than ‘k’. Let’s say the total count is ‘bad’.
  3. Repeat step 2, for every window of length ‘cnt’ and take minimum of count ‘bad’ among them. This will be the final answer.
  4. C++

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C++ program to find minimum swaps required
    // to club all elements less than or equals
    // to k together
    #include <iostream>
    using namespace std;
      
    // Utility function to find minimum swaps
    // required to club all elements less than
    // or equals to k together
    int minSwap(int *arr, int n, int k) {
          
        // Find count of elements which are
        // less than equals to k
        int count = 0;
        for (int i = 0; i < n; ++i)
            if (arr[i] <= k)
                ++count;
          
        // Find unwanted elements in current
        // window of size 'count'
        int bad = 0;
        for (int i = 0; i < count; ++i)
            if (arr[i] > k)
                ++bad;
          
        // Initialize answer with 'bad' value of
        // current window
        int ans = bad;
        for (int i = 0, j = count; j < n; ++i, ++j) {
              
            // Decrement count of previous window
            if (arr[i] > k)
                --bad;
              
            // Increment count of current window
            if (arr[j] > k)
                ++bad;
              
            // Update ans if count of 'bad'
            // is less in current window
            ans = min(ans, bad);
        }
        return ans;
    }
      
    // Driver code
    int main() {
          
        int arr[] = {2, 1, 5, 6, 3};
        int n = sizeof(arr) / sizeof(arr[0]);
        int k = 3;
        cout << minSwap(arr, n, k) << "\n";
          
        int arr1[] = {2, 7, 9, 5, 8, 7, 4};
        n = sizeof(arr1) / sizeof(arr1[0]);
        k = 5;
        cout << minSwap(arr1, n, k);
        return 0;
    }

    chevron_right

    
    

    Java

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // Java program to find minimum 
    // swaps required to club all
    // elements less than or equals
    // to k together
    import java.lang.*;
      
    class GFG {
          
    // Utility function to find minimum swaps
    // required to club all elements less than
    // or equals to k together
    static int minSwap(int arr[], int n, int k) {
      
        // Find count of elements which are
        // less than equals to k
        int count = 0;
        for (int i = 0; i < n; ++i)
        if (arr[i] <= k)
            ++count;
      
        // Find unwanted elements in current
        // window of size 'count'
        int bad = 0;
        for (int i = 0; i < count; ++i)
        if (arr[i] > k)
            ++bad;
      
        // Initialize answer with 'bad' value of
        // current window
        int ans = bad;
        for (int i = 0, j = count; j < n; ++i, ++j) {
      
        // Decrement count of previous window
        if (arr[i] > k)
            --bad;
      
        // Increment count of current window
        if (arr[j] > k)
            ++bad;
      
        // Update ans if count of 'bad'
        // is less in current window
        ans = Math.min(ans, bad);
        }
        return ans;
    }
      
    // Driver code
    public static void main(String[] args) 
    {
        int arr[] = {2, 1, 5, 6, 3};
        int n = arr.length;
        int k = 3;
        System.out.print(minSwap(arr, n, k) + "\n");
      
        int arr1[] = {2, 7, 9, 5, 8, 7, 4};
        n = arr1.length;
        k = 5;
        System.out.print(minSwap(arr1, n, k));
    }
    }
      
    // This code is contributed by Anant Agarwal.

    chevron_right

    
    

    Python3

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    # Python3 program to find 
    # minimum swaps required
    # to club all elements less
    # than or equals to k together
      
    # Utility function to find 
    # minimum swaps required to 
    # club all elements less than
    # or equals to k together
    def minSwap(arr, n, k) :
          
        # Find count of elements
        # which are less than 
        # equals to k
        count = 0
        for i in range(0, n) :
            if (arr[i] <= k) :
                count = count + 1
          
        # Find unwanted elements 
        # in current window of 
        # size 'count'
        bad = 0
        for i in range(0, count) :
            if (arr[i] > k) :
                bad = bad + 1
          
        # Initialize answer with 
        # 'bad' value of current
        # window
        ans = bad
        j = count
        for i in range(0, n) :
              
            if(j == n) :
                break
                  
            # Decrement count of
            # previous window
            if (arr[i] > k) :
                bad = bad - 1
              
            # Increment count of 
            # current window
            if (arr[j] > k) :
                bad = bad + 1
              
            # Update ans if count 
            # of 'bad' is less in
            # current window
            ans = min(ans, bad)
      
            j = j + 1
      
        return ans
      
    # Driver code
    arr = [2, 1, 5, 6, 3]
    n = len(arr)
    k = 3
    print (minSwap(arr, n, k))
      
    arr1 = [2, 7, 9, 5, 8, 7, 4]
    n = len(arr1)
    k = 5
    print (minSwap(arr1, n, k))
      
    # This code is contributed by 
    # Manish Shaw(manishshaw1)

    chevron_right

    
    

    C#

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C# program to find minimum 
    // swaps required to club all
    // elements less than or equals
    // to k together
    using System;
      
    class GFG {
          
        // Utility function to find minimum swaps
        // required to club all elements less than
        // or equals to k together
        static int minSwap(int []arr, int n, int k) {
          
            // Find count of elements which are
            // less than equals to k
            int count = 0;
            for (int i = 0; i < n; ++i)
            if (arr[i] <= k)
                ++count;
          
            // Find unwanted elements in current
            // window of size 'count'
            int bad = 0;
            for (int i = 0; i < count; ++i)
            if (arr[i] > k)
                ++bad;
          
            // Initialize answer with 'bad' value of
            // current window
            int ans = bad;
            for (int i = 0, j = count; j < n; ++i, ++j) {
          
                // Decrement count of previous window
                if (arr[i] > k)
                    --bad;
              
                // Increment count of current window
                if (arr[j] > k)
                    ++bad;
              
                // Update ans if count of 'bad'
                // is less in current window
                ans = Math.Min(ans, bad);
            }
            return ans;
        }
          
        // Driver code
        public static void Main() 
        {
            int []arr = {2, 1, 5, 6, 3};
            int n = arr.Length;
            int k = 3;
            Console.WriteLine(minSwap(arr, n, k));
          
            int []arr1 = {2, 7, 9, 5, 8, 7, 4};
            n = arr1.Length;
            k = 5;
            Console.WriteLine(minSwap(arr1, n, k));
        }
    }
      
    // This code is contributed by vt_m.

    chevron_right

    
    

    PHP

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    <?php
    // PHP program to find
    // minimum swaps required
    // to club all elements 
    // less than or equals
    // to k together
      
    // Utility function to 
    // find minimum swaps
    // required to club all 
    // elements less than
    // or equals to k together
    function minSwap($arr, $n, $k)
    {
          
        // Find count of elements
        // which are less than
        // equals to k
        $count = 0;
        for ($i = 0; $i < $n; ++$i)
            if ($arr[$i] <= $k)
                ++$count;
          
        // Find unwanted elements in current
        // window of size 'count'
        $bad = 0;
        for ($i = 0; $i < $count; ++$i)
            if ($arr[$i] > $k)
                ++$bad;
          
        // Initialize answer 
        // with 'bad' value of
        // current window
        $ans = $bad;
        for ($i = 0, $j = $count; $j < $n
                               ++$i, ++$j
        {
              
            // Decrement count of 
            // previous window
            if ($arr[$i] > $k)
                --$bad;
              
            // Increment count of
            // current window
            if ($arr[$j] > $k)
                ++$bad;
              
            // Update ans if count of 'bad'
            // is less in current window
            $ans = min($ans, $bad);
        }
        return $ans;
    }
      
    // Driver code
    $arr = array(2, 1, 5, 6, 3);
    $n = sizeof($arr);
    $k = 3;
    echo(minSwap($arr, $n, $k) . "\n");
          
    $arr1 = array(2, 7, 9, 5, 8, 7, 4);
    $n = sizeof($arr1);
    $k = 5;
    echo(minSwap($arr1, $n, $k));
      
    // This code is contributed by Ajit.
    ?>

    chevron_right

    
    


    Output :

    1
    2

    Time complexity: O(n)
    Auxiliary space: O(1)



    My Personal Notes arrow_drop_up

    Check out this Author's contributed articles.

    If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

    Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



    Improved By : jit_t, manishshaw1



    Article Tags :
    Practice Tags :


    25


    Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.