📌  相关文章
📜  {1,.. n}在字典上的最小排列,因此没有。和位置不匹配

📅  最后修改于: 2021-04-23 18:30:43             🧑  作者: Mango

给定一个正整数n,找到{1,2,.. n}在字典上最小的排列p,以使p i != iie,我不应该在i从1到n变化的第i个位置。

例子:

Input : 5
Output : 2 1 4 5 3
Consider the two permutations that follow
the requirement that position and numbers
should not be same.
p = (2, 1, 4, 5, 3) and q = (2, 4, 1, 5, 3).  
Since p is lexicographically smaller, our 
output is p.

Input  : 6
Output : 2 1 4 3 6 5

由于我们需要字典上最小的(并且1不能位于位置1),因此我们将2放在第一位置。在2之后,我们放置下一个最小元素,即1。之后,考虑它的下一个最小元素不违反pi!= i的条件。
现在,如果我们的n是偶数,我们简单地取两个变量,一个将包含我们的偶数计数,另一个将包含我们的奇数计数,然后我们将它们加到向量中直到达到n。
但是,如果我们的n为奇数,我们将执行相同的任务,直到达到n-1,因为如果我们将其加至n,那么最后我们将最终得到p i = i。因此,当我们到达n-1时,我们首先将n添加到位置n-1,然后在位置n上放置n-2。
上述程序的实现如下。

C++
// C++ implementation of the above approach
#include 
using namespace std;
  
// Function to print the permutation
void findPermutation(vector a, int n)
{
    vector res;   
  
    // Initial numbers to be pushed to result
    int en = 2, on = 1; 
  
    // If n is even
    if (n % 2 == 0) {
        for (int i = 0; i < n; i++) {
            if (i % 2 == 0) {
                res.push_back(en);
                en += 2;
            } else {
                res.push_back(on);
                on += 2;
            }
        }
    } 
  
    // If n is odd
    else {
        for (int i = 0; i < n - 2; i++) {
            if (i % 2 == 0) {
                res.push_back(en);
                en += 2;
            } else {
                res.push_back(on);
                on += 2;
            }
        }
        res.push_back(n);
        res.push_back(n - 2);
    }
  
    // Print result
    for (int i = 0; i < n; i++) 
        cout << res[i] << " ";    
    cout << "\n";
}
  
// Driver Code
int main()
{
    long long int n = 9;
    findPermutation(n);
    return 0;
}


Java
// Java implementation of the above approach
import java.util.Vector;
  
class GFG {
  
// Function to print the permutation
    static void findPermutation(int n) {
        Vector res = new Vector();
  
        // Initial numbers to be pushed to result
        int en = 2, on = 1;
  
        // If n is even
        if (n % 2 == 0) {
            for (int i = 0; i < n; i++) {
                if (i % 2 == 0) {
                    res.add(en);
                    en += 2;
                } else {
                    res.add(on);
                    on += 2;
                }
            }
        } // If n is odd
        else {
            for (int i = 0; i < n - 2; i++) {
                if (i % 2 == 0) {
                    res.add(en);
                    en += 2;
                } else {
                    res.add(on);
                    on += 2;
                }
            }
            res.add(n);
            res.add(n - 2);
        }
  
        // Print result
        for (int i = 0; i < n; i++) {
            System.out.print(res.get(i) + " ");
        }
        System.out.println("");
    }
  
// Driver Code
    public static void main(String[] args) {
        int n = 9;
        findPermutation(n);
    }
}
// This code is contributed by PrinciRaj1992


Python3
# Python3 implementation of the above approach
  
# Function to print the permutation 
def findPermutation(n) :
  
    res = []
  
    # Initial numbers to be pushed to result 
    en, on = 2, 1
  
    # If n is even 
    if (n % 2 == 0) :
        for i in range(n) : 
            if (i % 2 == 0) : 
                res.append(en)
                en += 2 
            else :
                res.append(on) 
                on += 2 
           
  
    # If n is odd 
    else : 
        for i in range(n-2) :
            if (i % 2 == 0) : 
                res.append(en) 
                en += 2
            else : 
                res.append(on)
                on += 2
              
           
        res.append(n)
        res.append(n - 2) 
       
  
    # Print result 
    for i in range(n) :
        print(res[i] ,end = " ")     
    print() 
  
  
# Driver Code 
if __name__ == "__main__" :
   
    n = 9; 
    findPermutation(n) 
  
# This code is contributed by Ryuga


C#
// C# implementation of the above approach 
using System;
using System.Collections;
public class GFG { 
  
// Function to print the permutation 
    static void findPermutation(int n) { 
        ArrayList res = new ArrayList(); 
  
        // Initial numbers to be pushed to result 
        int en = 2, on = 1; 
  
        // If n is even 
        if (n % 2 == 0) { 
            for (int i = 0; i < n; i++) { 
                if (i % 2 == 0) { 
                    res.Add(en); 
                    en += 2; 
                } else { 
                    res.Add(on); 
                    on += 2; 
                } 
            } 
        } // If n is odd 
        else { 
            for (int i = 0; i < n - 2; i++) { 
                if (i % 2 == 0) { 
                    res.Add(en); 
                    en += 2; 
                } else { 
                    res.Add(on); 
                    on += 2; 
                } 
            } 
            res.Add(n); 
            res.Add(n - 2); 
        } 
  
        // Print result 
        for (int i = 0; i < n; i++) { 
            Console.Write(res[i] + " "); 
        } 
        Console.WriteLine(""); 
    } 
  
// Driver Code 
    public static void Main() { 
        int n = 9; 
        findPermutation(n); 
    } 
} 
// This code is contributed by 29AjayKumar


PHP


输出:

2 1 4 3 6 5 8 9 7

时间复杂度: O(n)