LC 1913.Maximum Product Difference Between Two Pairs

题目描述

这是 LeetCode 上的 1913. 两个数对之间的最大乘积差 ,难度为简单

两个数对 (a, b)(c, d) 之间的 乘积差 定义为 (a * b) - (c * d)

  • 例如,(5, 6)(2, 7) 之间的乘积差是 (5 * 6) - (2 * 7) = 16

给你一个整数数组 nums ,选出四个 不同的 下标 wxyz ,使数对 (nums[w], nums[x])(nums[y], nums[z]) 之间的 乘积差 取到 最大值

返回以这种方式取得的乘积差中的 最大值

示例 1:

1
2
3
4
输入:nums = [5,6,2,7,4]
输出:34
解释:可以选出下标为 1 和 3 的元素构成第一个数对 (6, 7) 以及下标 2 和 4 构成第二个数对 (2, 4)
乘积差是 (6 * 7) - (2 * 4) = 34

示例 2:

1
2
3
4
输入:nums = [4,2,5,9,7,4,8]
输出:64
解释:可以选出下标为 3 和 6 的元素构成第一个数对 (9, 8) 以及下标 1 和 5 构成第二个数对 (2, 4)
乘积差是 (9 * 8) - (2 * 4) = 64

提示:

  • 4 <= nums.length <= 10^4
  • 1 <= nums[i] <= 10^4

解答

方法一:贪心

要求差值最大,即求出最大的两个值相乘减去最小的两个值相乘,因此,只需遍历一次数组 nums ,找出这四个数即可,本题的思路类似于LC 1464.Maximum Product of Two Elements in an Array - Abel's Blog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int maxProductDifference(int[] nums) {
int a = 0, b = a, c = Integer.MAX_VALUE, d = c;
for (var num : nums) {
if (num > a) {
b = a;
a = num;
} else if (num > b) {
b = num;
}
if (num < c) {
d = c;
c = num;
} else if (num < d) {
d = num;
}
}
return a * b - c * d;
}
}
  • 时间复杂度\(O(n)\),其中 n 为数组 nums 的长度。

  • 空间复杂度\(O(1)\)

方法二:排序

排序之后取出最前面的两个数和最后面的两个数,按照要求相乘之后做差即可。

1
2
3
4
5
6
class Solution {
public int maxProductDifference(int[] nums) {
Arrays.sort(nums);
return nums[nums.length - 1] * nums[nums.length - 2] - nums[0] * nums[1];
}
}
  • 时间复杂度\(O(n \log n)\),内部排序算法的时间复杂度为 \(O(n \log n)\)

  • 空间复杂度\(O(n)\),排序的空间复杂度为 \(O(n)\)

每题一图


LC 1913.Maximum Product Difference Between Two Pairs
https://chen-huaneng.github.io/2023/12/11/2023-12-11-2023-12-11-lc-1913/
作者
Abel
发布于
2023年12月11日
更新于
2023年12月11日
许可协议