C++ 通过选择满足 arr[i] >= arr[j] 的配对元素,将数组的最后剩下的元素最小化,并用 arr[i] – arr[j] 替换 arr[i]

C++ 通过选择满足 arr[i] >= arr[j] 的配对元素,将数组的最后剩下的元素最小化,并用 arr[i] – arr[j] 替换 arr[i]

给定一个非负整数数组,我们可以对给定数组进行任意次数的操作,以便我们可以选择数组中的任意一个元素,并选择另一个小于或等于当前元素的元素,并将其从第一个元素中减去。如果减去后第一个元素变为零,则将其删除。

在应用上述描述的方法任意次数后,我们需要找到数组中可能的最小元素。

示例示例

输入

int arr[] = {12, 18, 6, 9, 15}

输出

3

解释

我们可以从15中移除6,然后数组会变为:{12,18,6,9,9}。

我们可以从9中移除9,并从数组中移除零:

{12,18,6,9}

我们可以从18中三次删除6,并从12中两次删除,我们将得到{6,9}

最后,我们可以从9中删除6 => {6,3}。

最后,从6中删除两次3,我们将得到3作为最小的最终答案。

输入

int arr[] = {2, 8, 4, 1}

输出

1

Explanation : 我们可以从每个给定的数组元素中最多减去它们自己的次数,得到1作为最小答案。

Observation

我们可以始终从最大的元素中减去最小的元素,所以我们始终可以通过减去最小的元素来减小较大的元素。但是,从较大的元素中减去值后可能会变得更小,然后我们可以用它来减少先前较小的元素,直到其中一个变为零。

因此,对于两个元素x和y,上述方法可以实现如下代码:

伪代码

while(x != 0 || y != 0){
    if(x > y){
        swap(x,y);
}
y = y -x; 
}

这里的事实是,最后剩下的元素将是x和y的最大公约数,因为上面的伪代码对于最大公约数是相同的。

此外,上面代码的时间复杂度是O(min(X,Y)),非常高,相反,我们可以使用C++编程语言的内置最大公约数函数来在对数时间内获得解决方案。

伪代码

while(x != 0 || y !=0 ){
    if(x > y){
        swap(x,y);
}
y = y % x;
}

在上述的方法中,我们使用取模而不是减法,在非常短的时间内得到相同的结果。

方法

我们已经了解了GCD的基础知识,所以在这种方法中,我们将使用内置的gcd函数。让我们看看代码实现的步骤:

  • 首先,我们将创建一个函数,并将给定的数组和其大小作为参数传递给该函数,它将返回最终答案作为返回值。

  • 在函数中,我们将创建一个整数来存储完整数组的gcd。同时,它将被初始化为0,因为它不会影响数组的gcd。

  • 我们将使用for循环遍历数组,在每次迭代中,我们将对当前索引元素和变量的gcd进行计算。

  • 我们将使用C ++编程语言的内置gcd函数,并将结果存储在同一变量中。

  • 最后,我们将返回最终答案并在主函数中打印它。

示例

#include <bits/stdc++.h>
using namespace std;

// helper function to get the answer 
int getMin(int arr[], int n){
   int gcd = 0; // variable to store the gcd
   // traversing over the given array 
   for(int i=0; i<n; i++){
      gcd = __gcd(gcd, arr[i]);
   }
   // return the final answer
   return gcd;
}
// main function 
int main(){
   int arr[] = {12, 18, 6, 9, 15}; // given array 
   int n = 5; // size of the given array 
   //calling the function 
   int ans = getMin(arr, n);
   cout<<"The minimum element remains in the array after performing the given operations a maximum possible number of times is: "<<ans<<endl;
   return 0;
}

输出

The minimum element remains in the array after performing the given operations a maximum possible number of times is: 3

时间和空间复杂度

上面代码的时间复杂度是O(N*log(max(arr元素))), 这里我们遍历了数组,所以有因素N,而由于有内置的gcd函数,我们得到了log的因素。

上面代码的空间复杂度是O(1), 因为我们没有使用任何额外的空间。

结论

在本教程中,我们实现了一个程序,通过删除其他元素,找到数组中最小的数。如果其他数大于或等于该数,我们可以从其他数中删除该数,如果它变为零,我们将从数组中删除它。我们使用了gcd方法来计算答案,时间复杂度为O(N*log(max_array_element)),空间复杂度为常量。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程