C++ 中数组所有对的最大模(其中 arr[i] >= arr[j])
在这个问题中,我们得到一个包含 n 个元素的数组。我们的任务是创建一个程序来查找数组所有对的最大模,其中 arr[i] >= arr[j]。
在这里,我们需要找到 arr[i] % arr[j] 的最大值,其中 arr[i] >= arr[j]。
让我们举个例子来理解这个问题,
输入 − arr[] = {3, 5, 9}
输出 − 4
解释 −
All possible Pairs arr[i] and arr[j], 5, 3 => 5%3 = 2 9, 3 => 9%3 = 0 9, 5 => 9%5 = 4
为了解决这个问题,一个简单直接的方法是运行两个嵌套循环,并找到每对可能的模。然后,找到它们的最大值。但是,此解决方案效率不高,因为它的复杂度将是 O(n^2) 级别。
一个有效的方法将应用于排序数组。算法将以以下方式应用:
对于数组中的每个元素 arr[j],我们将找到其倍数的值,例如 x,直到找到大于数组最大元素的值。然后,我们将找到数组中所有满足 arr[i] < x 的值。找到 arr[i] % arr[j],并在每次操作后将模值的最大值存储在 maxModulo 变量中。
让我们使用此解决方案解决一个示例,它将展示算法的功能:
arr = {3, 5, 9}
arr[j] = 3 for j = 0,
x = {6, 9}
For x = 6, arr[i] = 5,
arr[i]%arr[j] = 6%5 = 2, maxModulo = 2
For x = 9, arr[i] = 9,
arr[i]%arr[j] = 9%3 = 0, maxModulo = 2
arr[j] = 5 for j = 1,
x = {10}
For x = 10, arr[i] = 9,
arr[i]%arr[j] = 9%5 = 4, maxModulo =4示例
程序用于查找数组所有对的最大模,其中 arr[i] >= arr[j] −
#include <bits/stdc++.h>
using namespace std;
int maxModulo(int arr[], int n) {
int maxModulo = 0;
sort(arr, arr + n);
for (int j = n - 2; j >= 0; --j) {
if (maxModulo >= arr[j])
break;
if (arr[j] == arr[j + 1])
continue;
for (int k = 2 * arr[j]; k <= arr[n - 1] + arr[j]; k += arr[j]) {
int i = lower_bound(arr, arr + n, k) - arr;
maxModulo = max(maxModulo, arr[i - 1] % arr[j]);
}
}
return maxModulo;
}
int main() {
int arr[] = {3, 5, 9};
int n = sizeof(arr) / sizeof(arr[0]);
cout<<"The maximum modulo of all pairs is "<<maxModulo(arr, n);
}输出
The maximum modulo of all pairs is 4
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP