给定大小为N的排列 P ,其值从1 到 N 。任务是找到所需的最小相邻交换次数,以便对于[1, N]范围内的所有 i , P[i] 不等于 i 。
例子:
Input: P = [1, 4, 3, 5, 2]
Output: 2
Explanation:
Here P = [1, 4, 3, 5, 2] at index 1, 2, 3, 4, 5. As we can see, P[1] = 1 and P[3] = 3. Hence, we need to get rid of this invariant.
Swap 1: Swap index 1 and index 2 => [4, 1, 3, 5, 2]
Swap 2: Swap index 2 and index 3 => [4, 3, 1, 5, 2]
The final array has no i where P[i] = i. Hence, a minimum of 2 swaps is required.
Input: P = [1, 2, 4, 9, 5, 8, 7, 3, 6]
Output: 3
Explanation:
Swap 1: Swap index 1 and index 2 => [2, 1, 4, 9, 5, 8, 7, 3, 6]
Swap 2: Swap index 5 and index 6 => [2, 1, 4, 9, 8, 5, 7, 3, 6]
Swap 2: Swap index 7 and index 8 => [2, 1, 4, 9, 8, 5, 3, 7, 6]
Hence, a minimum of 3 swaps is required.
方法:让我们考虑P[i] = i的位置由X表示,其他位置由O 表示。以下是对这个问题的三个基本观察:
- 如果排列的任何两个相邻索引处的值的形式为XO ,我们可以简单地交换 2 个索引以获得 ‘OO’。
- 如果排列的任意两个相邻索引处的值的形式为XX ,我们可以简单地交换 2 个索引以获得 ‘OO’。
- 如果排列的任何两个相邻索引处的值的形式为OX ,则一旦指针到达X 处的索引,它就只是‘XO’或‘XX’ 。
以下是步骤:
- 从1 到 N – 1迭代并检查是否P[i] = i然后我们简单地交换 (P[i], P[i + 1]) ,否则继续下一个相邻对的过程。
- 给定问题的极端情况是当i = N 时,如果 P[i] = i,那么我们交换 (P[i], P[i – 1]) 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the minimum
// number of swaps
void solve(vector& P, int n)
{
// New array to convert
// to 1-based indexing
vector arr;
arr.push_back(0);
for (auto x : P)
arr.push_back(x);
// Keeps count of swaps
int cnt = 0;
for (int i = 1; i < n; i++) {
// Check if it is an 'X' position
if (arr[i] == i) {
swap(arr[i], arr[i + 1]);
cnt++;
}
}
// Corner Case
if (arr[n] == n) {
swap(arr[n - 1], arr[n]);
cnt++;
}
// Print the minimum swaps
cout << cnt << endl;
}
// Driver Code
signed main()
{
// Given Number N
int N = 9;
// Given Permutation of N numbers
vector P = { 1, 2, 4, 9, 5,
8, 7, 3, 6 };
// Function Call
solve(P, N);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG{
// Function to find the minimum
// number of swaps
static void solve(int P[], int n)
{
// New array to convert
// to 1-based indexing
int arr[] = new int[n + 1];
arr[0] = 0;
for(int i = 0; i < n; i++)
arr[i + 1] = P[i];
// Keeps count of swaps
int cnt = 0;
for(int i = 1; i < n; i++)
{
// Check if it is an 'X' position
if (arr[i] == i)
{
int t = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = t;
cnt++;
}
}
// Corner Case
if (arr[n] == n)
{
// Swap
int t = arr[n - 1];
arr[n - 1] = arr[n];
arr[n] = t;
cnt++;
}
// Print the minimum swaps
System.out.println(cnt);
}
// Driver code
public static void main(String[] args)
{
// Given Number N
int N = 9;
// Given Permutation of N numbers
int P[] = new int[]{ 1, 2, 4, 9, 5,
8, 7, 3, 6 };
// Function Call
solve(P, N);
}
}
// This code is contributed by Pratima Pandey
Python3
# Python3 program for the above approach
# Function to find the minimum
# number of swaps
def solve(P, n):
# New array to convert
# to 1-based indexing
arr = []
arr.append(0)
for x in P:
arr.append(x)
# Keeps count of swaps
cnt = 0
for i in range(1, n):
# Check if it is an 'X' position
if (arr[i] == i):
arr[i], arr[i + 1] = arr[i + 1], arr[i]
cnt += 1
# Corner Case
if (arr[n] == n):
arr[n - 1], arr[n] = arr[n] , arr[n - 1]
cnt += 1
# Print the minimum swaps
print(cnt)
# Driver Code
# Given number N
N = 9
# Given permutation of N numbers
P = [ 1, 2, 4, 9, 5,
8, 7, 3, 6 ]
# Function call
solve(P, N)
# This code is contributed by chitranayal
C#
// C# program for the above approach
using System;
class GFG{
// Function to find the minimum
// number of swaps
static void solve(int []P, int n)
{
// New array to convert
// to 1-based indexing
int []arr = new int[n + 1];
arr[0] = 0;
for(int i = 0; i < n; i++)
arr[i + 1] = P[i];
// Keeps count of swaps
int cnt = 0;
for(int i = 1; i < n; i++)
{
// Check if it is an 'X' position
if (arr[i] == i)
{
int t = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = t;
cnt++;
}
}
// Corner Case
if (arr[n] == n)
{
// Swap
int t = arr[n - 1];
arr[n - 1] = arr[n];
arr[n] = t;
cnt++;
}
// Print the minimum swaps
Console.WriteLine(cnt);
}
// Driver code
public static void Main(String[] args)
{
// Given Number N
int N = 9;
// Given Permutation of N numbers
int []P = { 1, 2, 4, 9, 5,
8, 7, 3, 6 };
// Function Call
solve(P, N);
}
}
// This code is contributed by Princi Singh
Javascript
3
时间复杂度: O(N)
辅助空间:O(N)