- 作者: 負雪明燭
- id: fuxuemingzhu
- 個人博客:http://fuxuemingzhu.cn/
題目地址:https://leetcode-cn.com/problems/maximum-product-of-two-elements-in-an-array/
題目描述
給你一個整數數組 nums
,請你選擇數組的兩個不同下標 i
和 j
,使 (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
題目大意
略。
解題方法
暴力
首先想到暴力解法,即兩重循環,時間複雜度是 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月的開始,兒童節快樂!