1913. 两个数对之间的最大乘积差(java / c / c++ / python / go / rust)

180 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。


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
	
解释:
	可以选出下标为 13 的元素构成第一个数对 (6, 7) 以及下标 24 构成第二个数对 (2, 4)
	乘积差是 (6 * 7) - (2 * 4) = 34

样例 2:

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

提示:

  • 4 <= nums.length <= 10410^4
  • 1 <= nums[i] <= 10410^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://juejin.cn/user/2771185768884824/posts 博客原创~