Lexicographically largest permutation transformation
Last Updated :
14 Sep, 2023
Given an arr[] of size n, the task is to find the lexicographically largest permutation from the given permutation by performing the following operations exactly once where you will choose two integers l and r and reverse the subarray [l, r] and swap [1, l-1] with [r+1, n].
Examples:
Input: arr[] = { 2, 3, 1, 5, 4}
Output: {5, 4, 1, 3, 2 }
Explanation: we will choose l = 2 and r =3, then after performing operation, the permutation will be {5, 4, 3, 1, 2 }
Input: arr[] = { 6, 1, 2, 3, 5, 4 }
Output: {5, 4, 3, 6, 1, 2 }
Explanation: we will choose l = 4 and r = 4, then after performing the operation, the permutation will be {5, 4, 3, 6, 1, 2}
Approach: To solve the problem follow the below idea:
There will be two cases:
- If arr[0] = n . if arr[1] == n-1, then choose l = 0 and r = 0. Else let arr[j] = n-1, then choose l = j-1 and r = j-19(0-based indexing ) .
- If arr[0] != n . let arr[j] = n, then iterate while loop from j-1 to 0 till arr[i] > arr[0] and decrease i by 1, then our l will be i and r will be j.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void lexogra_permutation( int * arr, int n)
{
int j, k;
vector< int > permu;
if (arr[0] == n) {
if (arr[1] == n - 1) {
for ( int i = 1; i < n; i++) {
permu.push_back(arr[i]);
}
permu.push_back(arr[0]);
}
else {
for ( int i = 1; i < n; i++) {
if (arr[i] == n - 1) {
j = i;
break ;
}
}
for ( int i = j; i < n; i++) {
permu.push_back(arr[i]);
}
permu.push_back(arr[j - 1]);
for ( int i = 0; i < j - 1; i++) {
permu.push_back(arr[i]);
}
}
}
else {
for ( int i = 0; i < n; i++) {
if (arr[i] == n) {
j = i;
break ;
}
}
k = j - 2;
while (k >= 0 && arr[k] > arr[0]) {
if (arr[k - 1] > arr[0] && k - 1 >= 0) {
k--;
}
else {
break ;
}
}
for ( int i = j; i < n; i++) {
permu.push_back(arr[i]);
}
for ( int i = j - 1; i >= k; i--) {
permu.push_back(arr[i]);
}
for ( int i = 0; i < k; i++) {
permu.push_back(arr[i]);
}
}
for ( int i = 0; i < permu.size(); i++) {
cout << permu[i] << " " ;
}
}
int main()
{
int arr[] = { 2, 3, 1, 5, 4 };
int n = sizeof (arr) / sizeof ( int );
lexogra_permutation(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG {
public static void lexograPermutation( int [] arr, int n)
{
int j = 0 , k;
ArrayList<Integer> permu = new ArrayList<>();
if (arr[ 0 ] == n) {
if (arr[ 1 ] == n - 1 ) {
for ( int i = 1 ; i < n; i++) {
permu.add(arr[i]);
}
permu.add(arr[ 0 ]);
}
else {
for ( int i = 1 ; i < n; i++) {
if (arr[i] == n - 1 ) {
j = i;
break ;
}
}
for ( int i = j; i < n; i++) {
permu.add(arr[i]);
}
permu.add(arr[j - 1 ]);
for ( int i = 0 ; i < j - 1 ; i++) {
permu.add(arr[i]);
}
}
}
else {
for ( int i = 0 ; i < n; i++) {
if (arr[i] == n) {
j = i;
break ;
}
}
k = j - 2 ;
while (k >= 0 && arr[k] > arr[ 0 ]) {
if (arr[k - 1 ] > arr[ 0 ] && k - 1 >= 0 ) {
k--;
}
else {
break ;
}
}
for ( int i = j; i < n; i++) {
permu.add(arr[i]);
}
for ( int i = j - 1 ; i >= k; i--) {
permu.add(arr[i]);
}
for ( int i = 0 ; i < k; i++) {
permu.add(arr[i]);
}
}
for ( int i = 0 ; i < permu.size(); i++) {
System.out.print(permu.get(i) + " " );
}
}
public static void main(String[] args)
{
int [] arr = { 2 , 3 , 1 , 5 , 4 };
int n = arr.length;
lexograPermutation(arr, n);
}
}
|
Python3
def lexogra_permutation(arr, n):
permu = []
if arr[ 0 ] = = n:
if arr[ 1 ] = = n - 1 :
for i in range ( 1 , n):
permu.append(arr[i])
permu.append(arr[ 0 ])
else :
for i in range ( 1 , n):
if arr[i] = = n - 1 :
j = i
break
for i in range (j, n):
permu.append(arr[i])
permu.append(arr[j - 1 ])
for i in range ( 0 , j - 1 ):
permu.append(arr[i])
else :
for i in range (n):
if arr[i] = = n:
j = i
break
k = j - 2
while k > = 0 and arr[k] > arr[ 0 ]:
if arr[k - 1 ] > arr[ 0 ] and k - 1 > = 0 :
k - = 1
else :
break
for i in range (j, n):
permu.append(arr[i])
for i in range (j - 1 , k - 1 , - 1 ):
permu.append(arr[i])
for i in range (k):
permu.append(arr[i])
for i in range ( len (permu)):
print (permu[i], end = " " )
arr = [ 2 , 3 , 1 , 5 , 4 ]
n = len (arr)
lexogra_permutation(arr, n)
|
C#
using System;
using System.Collections.Generic;
public class GFG {
static void LexograPermutation( int [] arr, int n)
{
int j = 0, k = 0;
List< int > permu = new List< int >();
if (arr[0] == n) {
if (arr[1] == n - 1) {
for ( int i = 1; i < n; i++) {
permu.Add(arr[i]);
}
permu.Add(arr[0]);
}
else {
for ( int i = 1; i < n; i++) {
if (arr[i] == n - 1) {
j = i;
break ;
}
}
for ( int i = j; i < n; i++) {
permu.Add(arr[i]);
}
permu.Add(arr[j - 1]);
for ( int i = 0; i < j - 1; i++) {
permu.Add(arr[i]);
}
}
}
else {
for ( int i = 0; i < n; i++) {
if (arr[i] == n) {
j = i;
break ;
}
}
k = j - 2;
while (k >= 0 && arr[k] > arr[0]) {
if (arr[k - 1] > arr[0] && k - 1 >= 0) {
k--;
}
else {
break ;
}
}
for ( int i = j; i < n; i++) {
permu.Add(arr[i]);
}
for ( int i = j - 1; i >= k; i--) {
permu.Add(arr[i]);
}
for ( int i = 0; i < k; i++) {
permu.Add(arr[i]);
}
}
foreach ( var element in permu)
{
Console.Write(element + " " );
}
}
public static void Main()
{
int [] arr = { 2, 3, 1, 5, 4 };
int n = arr.Length;
LexograPermutation(arr, n);
}
}
|
Javascript
function lexogra_permutation(arr, n) {
let j, k;
let permu = [];
if (arr[0] === n) {
if (arr[1] === n - 1) {
for (let i = 1; i < n; i++) {
permu.push(arr[i]);
}
permu.push(arr[0]);
} else {
for (let i = 1; i < n; i++) {
if (arr[i] === n - 1) {
j = i;
break ;
}
}
for (let i = j; i < n; i++) {
permu.push(arr[i]);
}
permu.push(arr[j - 1]);
for (let i = 0; i < j - 1; i++) {
permu.push(arr[i]);
}
}
}
else {
for (let i = 0; i < n; i++) {
if (arr[i] === n) {
j = i;
break ;
}
}
k = j - 2;
while (k >= 0 && arr[k] > arr[0]) {
if (arr[k - 1] > arr[0] && k - 1 >= 0) {
k--;
} else {
break ;
}
}
for (let i = j; i < n; i++) {
permu.push(arr[i]);
}
for (let i = j - 1; i >= k; i--) {
permu.push(arr[i]);
}
for (let i = 0; i < k; i++) {
permu.push(arr[i]);
}
}
for (let i = 0; i < permu.length; i++) {
document.write(permu[i] + " " );
}
}
const arr = [2, 3, 1, 5, 4];
const n = arr.length;
lexogra_permutation(arr, n);
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...