1913. 两个数对之间的最大乘积差:
两个数对 (a, b)
和 (c, d)
之间的 乘积差 定义为 (a * b) - (c * d)
。
- 例如,
(5, 6)
和(2, 7)
之间的乘积差是(5 * 6) - (2 * 7) = 16
。
给你一个整数数组 nums
,选出四个 不同的 下标 w
、x
、y
和 z
,使数对 (nums[w], nums[x])
和 (nums[y], nums[z])
之间的 乘积差 取到 最大值 。
返回以这种方式取得的乘积差中的 最大值 。
样例 1:
输入:
nums = [5,6,2,7,4]
输出:
34
解释:
可以选出下标为 1 和 3 的元素构成第一个数对 (6, 7) 以及下标 2 和 4 构成第二个数对 (2, 4)
乘积差是 (6 * 7) - (2 * 4) = 34
样例 2:
输入:
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$
分析
- 面对这道算法题目,首先可以想一下两个正整数如何形成最大差值?
- 被减数尽可能大,减数尽可能小,就可以有最大差值。
- 两个正整数的乘积怎么尽可能大呢?
- 两个正整数尽可能大,他们的乘积就会最大化;反之两个正整数尽可能小,他们的乘积就会最小化。
- 所以我们其实要找出最大的两个数和最小的两个数。
- 最大的两个数相乘作为被减数,最小的两个数相乘作为减数。
- 在一个无序整数数组中如何找到两个最大值和两个最小值呢?
- 首先想到,可以先排序,然后取最前面两个数和最后面两个数。但是排序至少需要O(nlogn)的时间复杂度。
- 事实上我们只需要遍历一次,记录下最大的两个数和最小的两个数就可以了。
题解
java
class Solution {
public int maxProductDifference(int[] nums) {
int max1 = 0;
int max2 = 0;
int min1 = 10001;
int min2 = 10001;
for (int num : nums) {
if (num > max1) {
max2 = max1;
max1 = num;
} else if (num > max2) {
max2 = num;
}
if (num < min1) {
min2 = min1;
min1 = num;
} else if (num < min2) {
min2 = num;
}
}
return max1 * max2 - min1 * min2;
}
}
c
int maxProductDifference(int* nums, int numsSize){
int max1 = 0;
int max2 = 0;
int min1 = 10001;
int min2 = 10001;
for (int i = 0; i < numsSize; ++i) {
int num = nums[i];
if (num > max1) {
max2 = max1;
max1 = num;
} else if (num > max2) {
max2 = num;
}
if (num < min1) {
min2 = min1;
min1 = num;
} else if (num < min2) {
min2 = num;
}
}
return max1 * max2 - min1 * min2;
}
c++
class Solution {
public:
int maxProductDifference(vector<int>& nums) {
int max1 = 0;
int max2 = 0;
int min1 = 10001;
int min2 = 10001;
for (int num: nums) {
if (num > max1) {
max2 = max1;
max1 = num;
} else if (num > max2) {
max2 = num;
}
if (num < min1) {
min2 = min1;
min1 = num;
} else if (num < min2) {
min2 = num;
}
}
return max1 * max2 - min1 * min2;
}
};
python
class Solution:
def maxProductDifference(self, nums: List[int]) -> int:
max1 = 0
max2 = 0
min1 = 10001
min2 = 10001
for num in nums:
if num > max1:
max2 = max1
max1 = num
elif num > max2:
max2 = num
if num < min1:
min2 = min1
min1 = num
elif num < min2:
min2 = num;
return max1 * max2 - min1 * min2
go
func maxProductDifference(nums []int) int {
max1 := 0
max2 := 0
min1 := 10001
min2 := 10001
for _, num := range nums {
if num > max1 {
max2 = max1
max1 = num
} else if num > max2 {
max2 = num
}
if num < min1 {
min2 = min1
min1 = num
} else if num < min2 {
min2 = num
}
}
return max1*max2 - min1*min2
}
rust
impl Solution {
pub fn max_product_difference(nums: Vec<i32>) -> i32 {
let mut max1 = 0;
let mut max2 = 0;
let mut min1 = 10001;
let mut min2 = 10001;
nums.iter().for_each(|num| {
if *num > max1 {
max2 = max1;
max1 = *num;
} else if *num > max2 {
max2 = *num;
}
if *num < min1 {
min2 = min1;
min1 = *num;
} else if *num < min2 {
min2 = *num;
}
});
max1 * max2 - min1 * min2
}
}
原题传送门:https://leetcode-cn.com/problems/maximum-product-difference-between-two-pairs/
非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~