Given an array arr[], find the lexicographically smallest array that can be obtained after performing at maximum of k consecutive swaps. For example:-

Input:arr[] = {7, 6, 9, 2, 1} k = 3Output:arr[] = {2, 7, 6, 9, 1}Explanation:Array is: 7, 6, 9, 2, 1 Swap 1: 7, 6, 2, 9, 1 Swap 2: 7, 2, 6, 9, 1 Swap 3: 2, 7, 6, 9, 1So Our final array after k = 3 swaps :2, 7, 6, 9, 1Input:arr[] = {7, 6, 9, 2, 1} k = 1Output:arr[] = {6, 7, 9, 2, 1}

**Naive approach** is to generate all the permutation of array and pick the smallest one which satisfy the condition of at-most k swaps. Time complexity of this approach is Ω(n!), which will definitely time out for large value of n.

An **Efficient **approach is to think greedily. We first pick the smallest element from array a_{1}, a_{2}, a_{3}…(a_{k} or a_{n}) [We consider a_{k} when k is smaller, else n]. We place the smallest element to the a_{0} position after shifting all these elements by 1 position right. We subtract number of swaps (number of swaps is number of shifts minus 1) from k. If still we are left with k > 0 then we apply the same procedure from the very next starting position i.e., a_{2}, a_{3},…(a_{k} or a_{n}) and then place it to the a_{1} position. So we keep applying the same process until k becomes 0.

## C++

// C++ program to find lexicographically minimum // value after k swaps. #include<bits/stdc++.h> using namespace std ; // Modifies arr[0..n-1] to lexicographically smallest // with k swaps. void minimizeWithKSwaps(int arr[], int n, int k) { for (int i = 0; i<n-1 && k>0; ++i) { // Set the position where we want // to put the smallest integer int pos = i; for (int j = i+1; j<n ; ++j) { // If we exceed the Max swaps // then terminate the loop if (j-i > k) break; // Find the minimum value from i+1 to // max k or n if (arr[j] < arr[pos]) pos = j; } // Swap the elements from Minimum position // we found till now to the i index for (int j = pos; j>i; --j) swap(arr[j], arr[j-1]); // Set the final value after swapping pos-i // elements k -= pos-i; } } // Driver code int main() { int arr[] = {7, 6, 9, 2, 1}; int n = sizeof(arr)/sizeof(arr[0]); int k = 3; minimizeWithKSwaps(arr, n, k); //Print the final Array for (int i=0; i<n; ++i) cout << arr[i] <<" "; }

## Python

# Python program to find lexicographically minimum # value after k swaps. def minimizeWithKSwaps(arr, n, k): for i in range(n-1): # Set the position where we we want # to put the smallest integer pos = i for j in range(i+1, n): # If we exceed the Max swaps # then terminate the loop if (j-i > k): break # Find the minimum value from i+1 to # max (k or n) if (arr[j] < arr[pos]): pos = j # Swap the elements from Minimum position # we found till now to the i index for j in range(pos, i, -1): arr[j],arr[j-1] = arr[j-1], arr[j] # Set the final value after swapping pos-i # elements k -= pos - i # Driver Code n, k = 5, 3 arr = [7, 6, 9, 2, 1] minimizeWithKSwaps(arr, n, k) # Print the final Array for i in range(n): print(arr[i], end = " ")

Output:2 7 6 9 1

**Time complexity: **O(N^{2})

**Auxiliary space: **O(1)

**Reference:**

http://stackoverflow.com/questions/25539423/finding-minimal-lexicographical-array

This article is contributed by Shubham Bansal. 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 write comments if you find anything incorrect, or you want to share more information about the topic discussed above.