数组中两元素的最大乘积

标签: 数组 排序 堆(优先队列)

难度: Easy

给你一个整数数组 nums,请你选择数组的两个不同下标 ij使 (nums[i]-1)*(nums[j]-1) 取得最大值。

请你计算并返回该式的最大值。

示例 1:

输入:nums = [3,4,5,2]
输出:12 
解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)*(nums[2]-1) = (4-1)*(5-1) = 3*4 = 12 。 

示例 2:

输入:nums = [1,5,4,5]
输出:16
解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。

示例 3:

输入:nums = [3,7]
输出:12

提示:

  • 2 <= nums.length <= 500
  • 1 <= nums[i] <= 10^3

Submission

运行时间: 22 ms

内存: 16.1 MB

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        ret = max(nums)
        nums.remove(max(nums))
        return (ret-1)*(max(nums)-1)

            
        

Explain

此题解通过先找到数组中的最大元素并将其移除,然后再找到移除后数组中的最大元素,利用这两个最大值来计算题目要求的表达式的最大值。具体步骤为:首先使用max()函数找到数组nums中的最大值,并将其存储在变量ret中。接着,使用remove()方法将这个最大值从数组中移除。最后,再次使用max()函数找到现在数组中的最大值,并与之前找到的最大值ret计算给定表达式,得到结果。

时间复杂度: O(n)

空间复杂度: O(1)

# 定义Solution类
class Solution:
    # 定义maxProduct函数,接受一个整数列表nums
    def maxProduct(self, nums: List[int]) -> int:
        ret = max(nums)  # 找到nums中的最大值并存储在ret变量中
        nums.remove(ret)  # 从nums中移除已找到的最大值
        return (ret-1) * (max(nums)-1)  # 计算并返回题目要求的表达式的结果,此时nums中的最大值是第二大的数

Explore

题解的方法在这种情况下可能行不通。当数组中有多个相同的最大元素时,remove() 方法只会移除第一个找到的最大值,如果最大值重复,移除一个后,剩下的最大值依然是原来的最大值。因此,这种方法在数组中最大值重复的情况下并不会找到真正的次大值。

remove()方法会移除数组中遇到的第一个最大值。如果数组中的最大值有重复,那么只移除第一个遇到的最大值,这将导致最终的计算仍可能使用最大值(如果它重复的话),因此这种情况下结果不会受到影响,仍然是正确的。

是的,可以通过一次遍历同时找到最大值和次大值,这样更为高效。可以用两个变量来跟踪最大值和次大值,遍历数组时更新这两个变量。这种方法只需遍历一次数组,比使用两次max()函数和一次remove()方法更高效。

存在这样的方法。可以初始化两个变量,一个用于存储最大值,另一个用于存储次大值。在遍历数组的过程中,对每个元素,先判断它是否大于当前的最大值,如果是,则更新次大值为当前最大值,然后更新最大值为该元素;如果不是最大值但大于次大值,则更新次大值。这种方法只需要一次遍历,效率更高。