【LeetCode】1464. 數組中兩元素的最大乘積 Maximum Product of Two Elements in an Array (Python)


題目地址:https://leetcode-cn.com/problems/maximum-product-of-two-elements-in-an-array/

題目描述

給你一個整數數組 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

提示:

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

題目大意

略。

解題方法

暴力

首先想到暴力解法,即兩重循環,時間複雜度是 O(N^2),題目給出的數組大小隻有 500,因此滿足要求。

Python 代碼如下:

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        res = 0
        N = len(nums)
        for i in range(N):
            for j in range(i + 1, N):
                res = max(res, (nums[i] - 1) * (nums[j] - 1))
        return res

耗時:932 ms

找最大次大

題目給出的數字全部是正數,因此要求的乘積最大就是 (最大數 - 1) * (次大數 - 1)。題目化爲求最大值和次大值的問題。

第一種想法是排序,時間複雜度是 O(N * log(N)).

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        nums.sort()
        return (nums[-2] - 1) * (nums[-1] - 1)

耗時:52 ms

第二種想法是遍歷一遍,時間複雜度是 O(N)

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        first = 0
        second = 0
        for num in nums:
            if num > first:
                second = first
                first = num
            elif first >= num > second:
                second = num
        return (first - 1) * (second - 1)

耗時:40 ms

歡迎關注負雪明燭的刷題博客,leetcode刷題800多,每道都講解了詳細寫法!

日期

2020 年 6 月 1 日 —— 6月的開始,兒童節快樂!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章