给定一个数组arr [] ,该数组由整数[1,N]的排列组成,通过重新排列排序的顺序[1,N]得出,任务是找到最小的步骤数,之后最小的步骤数将排序的顺序[1,N]通过重复在每个步骤中从排序后的序列中获得arr []的相同过程来重复该过程。
例子:
Input: arr[ ] = {3, 6, 5, 4, 1, 2}
Output: 6
Explanation:
Increasing Permutation: {1, 2, 3, 4, 5, 6}
Step 1 : arr[] = {3, 6, 5, 4, 1, 2} (Given array)
Step 2 : arr[] = {5, 2, 1, 4, 3, 6}
Step 3 : arr[] = {1, 6, 3, 4, 5, 2}
Step 4 : arr[] = {3, 2, 5, 4, 1, 6}
Step 5 : arr[] = {5, 6, 1, 4, 3, 2}
Step 6 : arr[] = {1, 2, 3, 4, 5, 6} (Increasing Permutation)
Therefore, the total number of steps required are 6.
Input: arr[ ] = [5, 1, 4, 3, 2]
Output: 6
方法:
通过使用直接寻址的概念可以简单地解决此问题。请按照以下步骤解决问题:
- 初始化数组dat []以直接寻址。
- 迭代[1,N]并按排序顺序从每个元素的索引计算当前索引的差。
- 计算数组dat []的LCM。
- 现在,将获得的LCM打印为获得排序顺序所需的最少步骤。
下面是上述方法的实现:
C++14
// C++ Program to implement
// the above approach
#include
using namespace std;
// Function to find
// GCD of two numbers
int gcd(int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
// Function to calculate the
// LCM of array elements
int findlcm(int arr[], int n)
{
// Initialize result
int ans = 1;
for (int i = 1; i <= n; i++)
ans = (((arr[i] * ans))
/ (gcd(arr[i], ans)));
return ans;
}
// Function to find minimum steps
// required to obtain sorted sequence
void minimumSteps(int arr[], int n)
{
// Inititalize dat[] array for
// Direct Address Table.
int i, dat[n + 1];
for (i = 1; i <= n; i++)
dat[arr[i - 1]] = i;
int b[n + 1], j = 0, c;
// Calculating steps required
// for each element to reach
// its sorted position
for (i = 1; i <= n; i++) {
c = 1;
j = dat[i];
while (j != i) {
c++;
j = dat[j];
}
b[i] = c;
}
// Calculate LCM of the array
cout << findlcm(b, n);
}
// Driver Code
int main()
{
int arr[] = { 5, 1, 4, 3, 2, 7, 6 };
int N = sizeof(arr) / sizeof(arr[0]);
minimumSteps(arr, N);
return 0;
}
Java
// Java program to implement
// the above approach
class GFG{
// Function to find
// GCD of two numbers
static int gcd(int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
// Function to calculate the
// LCM of array elements
static int findlcm(int arr[], int n)
{
// Initialize result
int ans = 1;
for(int i = 1; i <= n; i++)
ans = (((arr[i] * ans)) /
(gcd(arr[i], ans)));
return ans;
}
// Function to find minimum steps
// required to obtain sorted sequence
static void minimumSteps(int arr[], int n)
{
// Inititalize dat[] array for
// Direct Address Table.
int i;
int dat[] = new int[n + 1];
for(i = 1; i <= n; i++)
dat[arr[i - 1]] = i;
int b[] = new int[n + 1];
int j = 0, c;
// Calculating steps required
// for each element to reach
// its sorted position
for(i = 1; i <= n; i++)
{
c = 1;
j = dat[i];
while (j != i)
{
c++;
j = dat[j];
}
b[i] = c;
}
// Calculate LCM of the array
System.out.println(findlcm(b, n));
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 5, 1, 4, 3, 2, 7, 6 };
int N = arr.length;
minimumSteps(arr, N);
}
}
// This code is contributed by rutvik_56
Python3
# Python3 program to implement
# the above approach
# Function to find
# GCD of two numbers
def gcd(a, b):
if(b == 0):
return a
return gcd(b, a % b)
# Function to calculate the
# LCM of array elements
def findlcm(arr, n):
# Initialize result
ans = 1
for i in range(1, n + 1):
ans = ((arr[i] * ans) //
(gcd(arr[i], ans)))
return ans
# Function to find minimum steps
# required to obtain sorted sequence
def minimumSteps(arr, n):
# Inititalize dat[] array for
# Direct Address Table.
dat = [0] * (n + 1)
for i in range(1, n + 1):
dat[arr[i - 1]] = i
b = [0] * (n + 1)
j = 0
# Calculating steps required
# for each element to reach
# its sorted position
for i in range(1, n + 1):
c = 1
j = dat[i]
while(j != i):
c += 1
j = dat[j]
b[i] = c
# Calculate LCM of the array
print(findlcm(b, n))
# Driver Code
arr = [ 5, 1, 4, 3, 2, 7, 6 ]
N = len(arr)
minimumSteps(arr, N)
# This code is contributed by Shivam Singh
C#
// C# program to implement
// the above approach
using System;
class GFG{
// Function to find
// GCD of two numbers
static int gcd(int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
// Function to calculate the
// LCM of array elements
static int findlcm(int []arr, int n)
{
// Initialize result
int ans = 1;
for(int i = 1; i <= n; i++)
ans = (((arr[i] * ans)) /
(gcd(arr[i], ans)));
return ans;
}
// Function to find minimum steps
// required to obtain sorted sequence
static void minimumSteps(int []arr, int n)
{
// Inititalize dat[] array for
// Direct Address Table.
int i;
int []dat = new int[n + 1];
for(i = 1; i <= n; i++)
dat[arr[i - 1]] = i;
int []b = new int[n + 1];
int j = 0, c;
// Calculating steps required
// for each element to reach
// its sorted position
for(i = 1; i <= n; i++)
{
c = 1;
j = dat[i];
while (j != i)
{
c++;
j = dat[j];
}
b[i] = c;
}
// Calculate LCM of the array
Console.WriteLine(findlcm(b, n));
}
// Driver code
public static void Main(String[] args)
{
int []arr = { 5, 1, 4, 3, 2, 7, 6 };
int N = arr.Length;
minimumSteps(arr, N);
}
}
// This code is contributed by gauravrajput1
6
时间复杂度: O(NlogN)
辅助空间: O(N)