最大化给定数组中两对之间的余差
给定一个大小为N的数组arr[] ,任务是找到 4 个索引i, j, k, l使得0 <= i, j, k, l < N和arr[i]%arr[j ] – arr[k]%arr[l]是最大值。打印最大差异。如果不存在,则打印-1。
例子:
Input: N=8, arr[] = {1, 2, 4, 6, 8, 3, 5, 7}
Output: 7
Explanation: Choosing elements 1, 2, 7, 8 and 2%1 – 7%8 gives the maximum result possible.
Input: N=3, arr[] = {1, 50, 101}
Output: -1
Explanation: Since, there are 3 elements only so there’s no possible answer.
天真的方法:蛮力的想法是检查所有可能的组合,然后找到最大的差异。
时间复杂度: O(N 4 )
辅助空间: O(1)
有效方法:这个想法是基于观察到的,在对数组进行升序排序时,从左侧选择第一对,即最小 2 个值,从右侧选择第二对,即最大 2 个值给出了答案。此外, arr[i+1]%arr[i]总是小于等于arr[i]%arr[i+1]。因此,最小化第一对值并最大化第二对值。请按照以下步骤解决问题:
- 如果数组的大小小于4,则返回-1。
- 按升序对数组arr[]进行排序。
- 首先将变量初始化为arr[1]%arr[0] ,然后将变量初始化为arr[N-2]%arr[N-1]。
- 执行上述步骤后,打印second-first的值作为答案。
下面是上述方法的实现。
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the required
// maximum difference
void maxProductDifference(vector& arr)
{
// Base Case
if (arr.size() < 4) {
cout << "-1\n";
return;
}
// Sort the array
sort(arr.begin(), arr.end());
// First pair
int first = arr[1] % arr[0];
// Second pair
int second = arr[arr.size() - 2]
% arr[arr.size() - 1];
// Print the result
cout << second - first;
return;
}
// Driver Code
int main()
{
vector arr = { 1, 2, 4, 6, 8, 3, 5, 7 };
maxProductDifference(arr);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
import java.util.Arrays;
class GFG
{
// Function to find the required
// maximum difference
static void maxProductDifference(int[] arr)
{
// Base Case
if (arr.length < 4) {
System.out.println("-1");
return;
}
// Sort the array
Arrays.sort(arr);
// First pair
int first = arr[1] % arr[0];
// Second pair
int second
= arr[arr.length - 2] % arr[arr.length - 1];
// Print the result
System.out.println(second - first);
return;
}
// Driver Code
public static void main(String[] args)
{
int[] arr = { 1, 2, 4, 6, 8, 3, 5, 7 };
maxProductDifference(arr);
}
}
// This code is contributed by Potta Lokesh
Python3
# python program for the above approach
# Function to find the required
# maximum difference
def maxProductDifference(arr):
# Base Case
if (len(arr) < 4):
print("-1")
return
# Sort the array
arr.sort()
# First pair
first = arr[1] % arr[0]
# Second pair
second = arr[len(arr) - 2] % arr[len(arr) - 1]
# Print the result
print(second - first)
# Driver Code
if __name__ == "__main__":
arr = [1, 2, 4, 6, 8, 3, 5, 7]
maxProductDifference(arr)
# This code is contributed by rakeshsahni
C#
// C# program for the above approach
using System;
public class GFG
{
// Function to find the required
// maximum difference
static void maxProductDifference(int[] arr)
{
// Base Case
if (arr.Length < 4) {
Console.WriteLine("-1");
return;
}
// Sort the array
Array.Sort(arr);
// First pair
int first = arr[1] % arr[0];
// Second pair
int second
= arr[arr.Length - 2] % arr[arr.Length - 1];
// Print the result
Console.WriteLine(second - first);
return;
}
// Driver Code
public static void Main(String[] args)
{
int[] arr = { 1, 2, 4, 6, 8, 3, 5, 7 };
maxProductDifference(arr);
}
}
// This code is contributed by shikhasingrajput
Javascript
输出:
7
时间复杂度: O(N*log(N))
辅助空间: O(1)