算法1913. 两个数对之间的最大乘积差(java / c / c++ / python / go / rust)
Posted 二当家的白帽子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法1913. 两个数对之间的最大乘积差(java / c / c++ / python / go / rust)相关的知识,希望对你有一定的参考价值。
文章目录
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 <= 1 0 4 10^4 104
- 1 <= nums[i] <= 1 0 4 10^4 104
分析
- 面对这道算法题目,首先可以想一下两个正整数如何形成最大差值?
- 被减数尽可能大,减数尽可能小,就可以有最大差值。
- 两个正整数的乘积怎么尽可能大呢?
- 两个正整数尽可能大,他们的乘积就会最大化;反之两个正整数尽可能小,他们的乘积就会最小化。
- 所以我们其实要找出最大的两个数和最小的两个数。
- 最大的两个数相乘作为被减数,最小的两个数相乘作为减数。
- 在一个无序整数数组中如何找到两个最大值和两个最小值呢?
- 首先想到,可以先排序,然后取最前面两个数和最后面两个数。但是排序至少需要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://le-yi.blog.csdn.net/ 博客原创~
以上是关于算法1913. 两个数对之间的最大乘积差(java / c / c++ / python / go / rust)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode1913. 两个数对之间的最大乘积差(C++)