Generate permutation of 1 to N such that absolute difference of consecutive numbers give K distinct integers
Last Updated :
08 Jul, 2022
Given two integers N and K where K < N, the task is to generate a permutation of integers from 1 to N such that the absolute difference of all the consecutive integers give exactly K distinct integers.
Examples:
Input: N = 3, K = 2
Output: 1 3 2
|1 - 3| = 2 and |3 - 2| = 1 which gives 2 distinct integers (2 and 1)
Input: N = 5, K = 4
Output: 1 5 2 4 3
|1 - 5| = 4, |5 - 2| = 3, |2 - 4| = 2 and |4 - 3| = 1 gives 4 distinct integers i.e. 4, 3, 2 and 1
Approach: The problem can be easily solved by simple observation. At the odd indices place increasing sequence 1, 2, 3, ... and at the even indices place the decreasing sequence N, N-1, N-2, ... and so on.
For N = 10, a permutation with distinct integers for consecutive absolute difference can be 1 10 2 9 3 8 4 7 5 6. The consecutive absolute difference gives integers 9, 8, 7 and so on.
So, first print K integers of such a sequence then make the rest of the differences equal to 1. The code is quite self explanatory.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
// Function to generate a permutation of integers
// from 1 to N such that the absolute difference of
// all the two consecutive integers give K distinct integers
void printPermutation(int N, int K)
{
// To store the permutation
vector<int> res;
int l = 1, r = N, flag = 0;
for (int i = 0; i < K; i++) {
if (!flag) {
// For sequence 1 2 3...
res.push_back(l);
l++;
}
else {
// For sequence N, N-1, N-2...
res.push_back(r);
r--;
}
// Flag is used to alternate between
// the above if else statements
flag ^= 1;
}
// Taking integers with difference 1
// If last element added was r + 1
if (!flag) {
for (int i = r; i >= l; i--)
res.push_back(i);
}
// If last element added was l - 1
else {
for (int i = l; i <= r; i++)
res.push_back(i);
}
// Print the permutation
for (auto i : res)
cout << i << " ";
}
// Driver code
int main()
{
int N = 10, K = 4;
printPermutation(N, K);
return 0;
}
Java
// Java implementation of the above approach
import java.util.Vector;
class GFG
{
// Function to generate a permutation
// of integers from 1 to N such that the
// absolute difference of all the two
// consecutive integers give K distinct integers
static void printPermutation(int N, int K)
{
// To store the permutation
Vector<Integer> res = new Vector<>();
int l = 1, r = N, flag = 0;
for (int i = 0; i < K; i++)
{
if (flag == 0)
{
// For sequence 1 2 3...
res.add(l);
l++;
}
else
{
// For sequence N, N-1, N-2...
res.add(r);
r--;
}
// Flag is used to alternate between
// the above if else statements
flag ^= 1;
}
// Taking integers with difference 1
// If last element added was r + 1
if (flag != 1)
{
for (int i = r; i >= l; i--)
{
res.add(i);
}
}
// If last element added was l - 1
else
{
for (int i = l; i <= r; i++)
{
res.add(i);
}
}
// Print the permutation
for (Integer i : res)
{
System.out.print(i + " ");
}
}
// Driver code
public static void main(String[] args)
{
int N = 10, K = 4;
printPermutation(N, K);
}
}
// This code is contributed by
// 29AjayKumar
Python3
# Python 3 implementation of the approach
# Function to generate a permutation
# of integers from 1 to N such that the
# absolute difference of all the two
# consecutive integers give K distinct
# integers
def printPermutation(N, K):
# To store the permutation
res = list();
l, r, flag = 1, N, 0
for i in range(K):
if flag == False:
# For sequence 1 2 3...
res.append(l)
l += 1
else:
# For sequence N, N-1, N-2...
res.append(r);
r -= 1;
# Flag is used to alternate between
# the above if else statements
flag = flag ^ 1;
# Taking integers with difference 1
# If last element added was r + 1
if flag == False:
for i in range(r, 2, -1):
res.append(i)
# If last element added was l - 1
else:
for i in range(l, r):
res.append(i)
# Print the permutation
for i in res:
print(i, end = " ")
# Driver code
N, K = 10, 4
printPermutation(N, K)
# This code is contributed by
# Mohit Kumar 29
C#
// C# implementation of the above approach
using System;
using System.Collections;
class GFG
{
// Function to generate a permutation
// of integers from 1 to N such that the
// absolute difference of all the two
// consecutive integers give K distinct integers
static void printPermutation(int N, int K)
{
// To store the permutation
ArrayList res = new ArrayList();
int l = 1, r = N, flag = 0;
for (int i = 0; i < K; i++)
{
if (flag == 0)
{
// For sequence 1 2 3...
res.Add(l);
l++;
}
else
{
// For sequence N, N-1, N-2...
res.Add(r);
r--;
}
// Flag is used to alternate between
// the above if else statements
flag ^= 1;
}
// Taking integers with difference 1
// If last element added was r + 1
if (flag != 1)
{
for (int i = r; i >= l; i--)
{
res.Add(i);
}
}
// If last element added was l - 1
else
{
for (int i = l; i <= r; i++)
{
res.Add(i);
}
}
// Print the permutation
foreach (int i in res)
{
Console.Write(i + " ");
}
}
// Driver code
public static void Main()
{
int N = 10, K = 4;
printPermutation(N, K);
}
}
// This code is contributed by PrinciRaj1992
PHP
<?php
// PHP implementation of the approach
// Function to generate a permutation
// of integers from 1 to N such that the
// absolute difference of all the two
// consecutive integers give K distinct
// integers
function printPermutation($N, $K)
{
// To store the permutation
$res = array();
$l = 1;
$r = $N;
$flag = 0;
for ($i = 0; $i < $K; $i++)
{
if (!$flag)
{
// For sequence 1 2 3...
array_push($res, $l);
$l++;
}
else
{
// For sequence N, N-1, N-2...
array_push($res, $r);
$r--;
}
// Flag is used to alternate between
// the above if else statements
$flag ^= 1;
}
// Taking integers with difference 1
// If last element added was r + 1
if (!$flag)
{
for ($i = $r; $i >= $l; $i--)
array_push($res, $i);
}
// If last element added was l - 1
else
{
for ($i = l; $i <= $r; $i++)
array_push($res, $i);
}
// Print the permutation
for($i = 0; $i < sizeof($res); $i++)
echo $res[$i], " ";
}
// Driver code
$N = 10;
$K = 4;
printPermutation($N, $K);
// This code is contributed by Ryuga
?>
JavaScript
<script>
// Javascript implementation of the approach
// Function to generate a permutation of
// integers from 1 to N such that the
// absolute difference of all the two
// consecutive integers give K distinct integers
function printPermutation(N, K)
{
// To store the permutation
var res = [];
var l = 1, r = N, flag = 0;
for(var i = 0; i < K; i++)
{
if (!flag)
{
// For sequence 1 2 3...
res.push(l);
l++;
}
else
{
// For sequence N, N-1, N-2...
res.push(r);
r--;
}
// Flag is used to alternate between
// the above if else statements
flag ^= 1;
}
// Taking integers with difference 1
// If last element added was r + 1
if (!flag)
{
for(var i = r; i >= l; i--)
res.push(i);
}
// If last element added was l - 1
else
{
for(var i = l; i <= r; i++)
res.push(i);
}
// Print the permutation
for(var i = 0; i< res.length; i++)
{
document.write(res[i] + " ");
}
}
// Driver code
var N = 10, K = 4;
printPermutation(N, K);
// This code is contributed by noob2000
</script>
Output: 1 10 2 9 8 7 6 5 4 3
Time Complexity : O(K+N)
Space Complexity : O(N)
Similar Reads
Generate a permutation of first N natural numbers having count of unique adjacent differences equal to K | Set 2 Given two positive integers N and K, the task is to construct a permutation of the first N natural numbers such that all possible absolute differences between adjacent elements are K. Examples: Input: N = 3, K = 1Output: 1 2 3Explanation: Considering the permutation {1, 2, 3}, all possible unique ab
8 min read
Generate a permutation of first N natural numbers having count of unique adjacent differences equal to K Given two positive integers N and K, the task is to construct a permutation of the first N natural numbers such that all possible absolute differences between adjacent elements is K. Examples: Input: N = 3, K = 1Output: 1 2 3Explanation: Considering the permutation {1, 2, 3}, all possible unique abs
11 min read
Count of N-digit numbers with absolute difference of adjacent digits not exceeding K | Set 2 Given two integers N and K, the task is to find the count of N-digit numbers such that the absolute difference of adjacent digits in the number is not greater than K.Examples: Input: N = 2, K = 1 Output: 26 Explanation: The numbers are 10, 11, 12, 21, 22, 23, 32, 33, 34, 43, 44, 45, 54, 55, 56, 65,
11 min read
Find permutation of [1, N] such that (arr[i] != i+1) and sum of absolute difference between arr[i] and (i+1) is minimum Given a positive integer N, the task is to find the permutation of the first N natural numbers, say arr[] such that (arr[i] != i + 1) and the sum of the absolute difference between arr[i] and (i + 1) is minimum. Examples: Input: N = 4Output: 2 1 4 3Explanation:Consider the permutation {2, 1, 4, 3},
6 min read
Find a permutation of 2N numbers such that the result of given expression is exactly 2K Given two integers N and K, the task is to find a permutation of first 2*N natural numbers such that the following equation is satisfied. \sum\limits_{i=1}^N |A_{2i-1}-A_{2i}| - |\sum\limits_{i=1}^N A_{2i-1}-A_{2i}|=2K Note: The value of K will always be less than or equal to N.Examples: Input : N =
5 min read
Count N-digit numbers whose digits does not exceed absolute difference of the two previous digits Given an integer N, the task is to count the number of N-digit numbers such that each digit, except the first and second digits, is less than or equal to the absolute difference of the previous two digits. Examples: Input: N = 1Output: 10Explanation: All the numbers from [0 - 9] are valid because th
9 min read