算法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 ,选出四个 不同的 下标 wxyz ,使数对 (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++)

Python|寻求两个数对之间的最大乘积

寻求两个数对之间的最大乘积

《九国列车》(学习报告)《leecode零基础指南》(第8天) ——贪心,对题目的处理及题解和错题的总结

最大和最小差(贪心算法)

华为OD机试 - 计算最大乘积(Java) | 机试题+算法思路+考点+代码解析 2023