给定一个由N个整数组成的数组arr [] ,任务是查找任意一对表达式的最大可能值(arr [i] * arr [j])+(arr [j] – arr [i])) (i,j) ,使得i≠j且0≤(i,j)
例子:
Input: arr[] = {-2, -8, 0, 1, 2, 3, 4}
Output: 22
Explanation:
For the pair (-8, -2) the value of the expression (arr[i] * arr[j]) + (arr[j] – arr[i])) = ((-2)*(-8) + (-2 – (-8))) = 22, which is maximum among all possible pairs.
Input: arr[] = {-47, 0, 12}
Output: 47
天真的方法:解决给定问题的最简单方法是生成数组的所有可能对,并找到给定表达式(arr [i] * arr [j])+(arr [j] – arr [i] ))并打印每对获得的最大值。
时间复杂度: O(N 2 )
辅助空间: O(1)
高效方法:上述方法也可以优化,它基于以下观察:表达式的最大值将通过选择数组的最大和第二个最大对或最小和第二个最小对来获得。请按照以下步骤解决问题:
- 初始化一个变量,例如ans ,以存储最终的最大值。
- 以升序对数组进行排序。
- 发现该阵列的最大和第二最大元素,说X和Y分别与更新ANS的最大ANS和表达的使用值X和Y的值的值。
- 求出数组的最小值和第二最小元素,说X和Y分别与更新ANS的最大ANS和表达的使用值X和Y的值的值。
- 完成上述步骤后,输出ans的值作为结果。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the value of
// the expression a * b + (b - a)
int calc(int a, int b)
{
return a * b + (b - a);
}
// Function to find the maximum value
// of the expression a * b + (b - a)
// possible for any pair (a, b)
int findMaximum(vector arr, int N)
{
// Sort the vector in ascending order
sort(arr.begin(), arr.end());
// Stores the maximum value
int ans = -1e9;
// Update ans by choosing the pair
// of the minimum and 2nd minimum
ans = max(ans, calc(arr[0], arr[1]));
// Update ans by choosing the pair
// of maximum and 2nd maximum
ans = max(ans, calc(arr[N - 2],
arr[N - 1]));
// Return the value of ans
return ans;
}
// Driver Code
int main()
{
vector arr = { 0, -47, 12 };
int N = (int)arr.size();
cout << findMaximum(arr, N);
return 0;
}
输出:
47
时间复杂度: O(N)
辅助空间: O(1)