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 integersvoid 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 codeint main(){    int N = 10, K = 4;    printPermutation(N, K);    return 0;} | 
Java
// Java implementation of the above approachimport 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# integersdef 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 codeN, K = 10, 4printPermutation(N, K)# This code is contributed by# Mohit Kumar 29 | 
C#
// C# implementation of the above approachusing 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 integersfunction 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 codevar N = 10, K = 4;printPermutation(N, K);// This code is contributed by noob2000</script> | 
1 10 2 9 8 7 6 5 4 3
Time Complexity : O(K+N)
Space Complexity : O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
