给定一个由N个元素组成的数组arr [] ,任务是通过用1替换任意两个互素数组元素来最小化数组长度。
例子:
Input: arr[] = {2, 3, 5}
Output: 1
Explanation:
Replace {2, 3} with 1 modifies the array to {1, 5}.
Replace {1, 5} with 1 modifies the array to {1}.
Input: arr[] = {6, 9, 15}
Output: 3
Explanation: No coprime pairs exist in the array. Therefore, no reduction possible.
天真的方法:最简单的方法是遍历数组并检查互质对。如果找到,则将其替换为1,以搜索下一个互质对,依此类推。
时间复杂度: O(N 3 *对数 N)
辅助空间: O(1)
高效方法:该方法基于以下事实:
1 is coprime with every number
这个想法是要找出数组中是否存在任何互质对。如果找到,则可以基于上述事实将所有数组元素减小为1。因此,如果找到任何互质数对,则所需答案将为1,否则答案将为数组的初始大小。
Illustration:
For arr[] = {2, 4, 6, 8, 9}
Here, as there exists a coprime pair {2, 9}, replacing them by 1 modifies the array to {1, 4, 6, 8}.
Since 1 is coprime with every number, the array can be reduced further in following steps:
{1, 4, 6, 8} -> {1, 6, 8} -> {1, 8} -> {1}
Hence, the array can be reduced to size 1.
下面是上述方法的实现:
C++
// C++ Program for the above approach
#include
using namespace std;
// Function to find the final array
// length by replacing coprime pair with 1
bool hasCoprimePair(vector& arr, int n)
{
// Iterate over all pairs of element
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
// Check if gcd is 1
if (__gcd(arr[i], arr[j]) == 1) {
return true;
}
}
}
// If no coprime pair
// found return false
return false;
}
// Driver code
int main()
{
int n = 3;
vector arr = { 6, 9, 15 };
// Check if atleast one coprime
// pair exists in the array
if (hasCoprimePair(arr, n)) {
cout << 1 << endl;
}
// If no such pair exists
else {
cout << n << endl;
}
}
Java
// Java Program for the above approach
import java.util.*;
class GFG{
// Recursive function to return
// gcd of a and b
static int __gcd(int a, int b)
{
return b == 0? a:__gcd(b, a % b);
}
// Function to find the final array
// length by replacing coprime pair with 1
static boolean hasCoprimePair(int []arr, int n)
{
// Iterate over all pairs of element
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
// Check if gcd is 1
if ((__gcd(arr[i], arr[j])) == 1)
{
return true;
}
}
}
// If no coprime pair
// found return false
return false;
}
// Driver code
public static void main(String[] args)
{
int n = 3;
int []arr = { 6, 9, 15 };
// Check if atleast one coprime
// pair exists in the array
if (hasCoprimePair(arr, n))
{
System.out.print(1 + "\n");
}
// If no such pair exists
else
{
System.out.print(n + "\n");
}
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 program for the above approach
import math
# Function to find the final array
# length by replacing coprime pair with 1
def hasCoprimePair(arr, n):
# Iterate over all pairs of element
for i in range(n - 1):
for j in range(i + 1, n):
# Check if gcd is 1
if (math.gcd(arr[i], arr[j]) == 1):
return True
# If no coprime pair
# found return false
return False
# Driver code
if __name__ == "__main__":
n = 3
arr = [ 6, 9, 15 ]
# Check if atleast one coprime
# pair exists in the array
if (hasCoprimePair(arr, n)):
print(1)
# If no such pair exists
else:
print(n)
# This code is contributed by chitranayal
C#
// C# Program for the above approach
using System;
class GFG{
// Recursive function to return
// gcd of a and b
static int __gcd(int a, int b)
{
return b == 0 ? a : __gcd(b, a % b);
}
// Function to find the readonly array
// length by replacing coprime pair with 1
static bool hasCoprimePair(int []arr, int n)
{
// Iterate over all pairs of element
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
// Check if gcd is 1
if ((__gcd(arr[i],
arr[j])) == 1)
{
return true;
}
}
}
// If no coprime pair
// found return false
return false;
}
// Driver code
public static void Main(String[] args)
{
int n = 3;
int []arr = { 6, 9, 15 };
// Check if atleast one coprime
// pair exists in the array
if (hasCoprimePair(arr, n))
{
Console.Write(1 + "\n");
}
// If no such pair exists
else
{
Console.Write(n + "\n");
}
}
}
// This code is contributed by Rajput-Ji
3
时间复杂度: O(N 2 * log N)
辅助空间: O(1)