Lexicographically smallest permutation with adjacent sum at least K
Last Updated :
06 Jul, 2023
Given two positive integers N and K, the task is to find a permutation P of length N such that the sum of every adjacent pair of elements in P is greater than or equal to K. If there are multiple permutations that satisfy the condition, you should output the lexicographically smallest one. If there is no permutation that satisfies the condition, you should output -1.
Note: In other words, you need to find a permutation P of the numbers [1, 2, …, N] such that P[i] + P[i+1] ≥ K for all 1 ≤ i ≤ N-1. The lexicographically smallest permutation is the one that comes first in alphabetical order when the numbers are written out in sequence. For example, [1, 2, 3] is lexicographically smaller than [1, 3, 2].
Examples:
Input: N = 6, K = 5
Output: 1 4 2 3 5 6
Explanation: Considering the permutation 1 4 2 3 5 6 sum of adjacent elements is greater than 5. There exists different permutation such as [3, 5, 1, 4, 2, 6], [1, 5, 2, 3, 4, 6], [6, 1, 4, 3, 5, 6]etc. But
[1, 4, 2, 3, 5, 6] is the lexicographically smallest one among them.
Input: N = 4, K = 6
Output: -1
Explanation: No such permutation exists which satisfies the above condition.
Approach: To solve the problem follow the below idea:
The idea is to first store K-1 numbers, starting with K, in descending order, at even indices of the array, and then store the remaining numbers in ascending order at odd indices of the array. Finally, any remaining indices are filled with the natural sequence of numbers.
Below are the steps for the above approach:
- Check if N is less than K. If so then no permutation can be generated which satisfies the above condition so print -1 and return.
- Create a vector say a to store the answer.
- Initialize two variables x = –K and y = 2.
- Increment k to the original value.
- Run a loop from i = 0 to i ≤ N,
- Check if i > 1 and i < K,
- Check if i%2 == 0, add the value x to the resultant vector a, and decrement x by 1.
- Else, add the value y to the resultant vector a, and increment y by 1.
- Else, add i to the resultant vector.
C++
#include <bits/stdc++.h>
using namespace std;
void Generatepermutation( int n, int k)
{
if (n < k - 1) {
cout << -1 << endl;
return ;
}
vector< int > a;
int x = --k;
int y = 2;
k++;
for ( int i = 1; i <= n; i++) {
if (i > 1 && i < k) {
if (i % 2 == 0) {
a.push_back(x);
x--;
}
else {
a.push_back(y);
y++;
}
}
else {
a.push_back(i);
}
}
for ( int i = 0; i < a.size(); i++) {
cout << a[i] << " " ;
}
cout << endl;
}
int main()
{
int N = 6, K = 5;
Generatepermutation(N, K);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
public static void Generatepermutation( int n, int k)
{
if (n < k - 1 ) {
System.out.println(- 1 );
return ;
}
ArrayList<Integer> a = new ArrayList<Integer>();
int x = --k;
int y = 2 ;
k++;
for ( int i = 1 ; i <= n; i++) {
if (i > 1 && i < k) {
if (i % 2 == 0 ) {
a.add(x);
x--;
}
else {
a.add(y);
y++;
}
}
else {
a.add(i);
}
}
for ( int i = 0 ; i < a.size(); i++) {
System.out.print(a.get(i) + " " );
}
System.out.println();
}
public static void main(String[] args)
{
int N = 6 , K = 5 ;
Generatepermutation(N, K);
}
}
|
Python3
def Generatepermutation(n, k):
if n < k - 1 :
print ( - 1 )
return
a = []
x = k - 1
y = 2
for i in range ( 1 , n + 1 ):
if i > 1 and i < k:
if i % 2 = = 0 :
a.append(x)
x - = 1
else :
a.append(y)
y + = 1
else :
a.append(i)
for i in range ( len (a)):
print (a[i], end = " " )
print ()
if __name__ = = '__main__' :
N = 6
K = 5
Generatepermutation(N, K)
|
C#
using System;
using System.Collections.Generic;
class Program
{
static void GeneratePermutation( int n, int k)
{
if (n < k - 1)
{
Console.WriteLine(-1);
return ;
}
List< int > a = new List< int >();
int x = --k;
int y = 2;
k++;
for ( int i = 1; i <= n; i++)
{
if (i > 1 && i < k)
{
if (i % 2 == 0)
{
a.Add(x);
x--;
}
else
{
a.Add(y);
y++;
}
}
else
{
a.Add(i);
}
}
foreach ( int num in a)
{
Console.Write(num + " " );
}
Console.WriteLine();
}
static void Main( string [] args)
{
int N = 6, K = 5;
GeneratePermutation(N, K);
}
}
|
Javascript
function Generatepermutation(n, k) {
if (n < k - 1) {
console.log(-1);
return ;
}
let a = [];
let x = --k;
let y = 2;
k++;
for (let i = 1; i <= n; i++) {
if (i > 1 && i < k) {
if (i % 2 == 0) {
a.push(x);
x--;
}
else {
a.push(y);
y++;
}
}
else {
a.push(i);
}
}
console.log(a.join( " " ));
}
let N = 6, K = 5;
Generatepermutation(N, K);
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...