↓快轉到主要內容
  1. LeetCode/

LeetCode 628: Maximum Product of Three Numbers

·1 分鐘· ·
LeetCode Easy Array Math Sorting
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-08-29

  • 提交紀錄:Wrong Answer → Accepted ×3

解題思路
#

三個數的乘積最大,只有兩種情況(Math 模板四):最大的三個相乘;或兩個最小的數(可能是絕對值很大的負數,負負得正)乘上最大的數。排序後取兩者較大值,不用分「有沒有正數」的情況。

我的嘗試
#

第一版的 index 打錯,寫成 nums[-1] * nums[-1] * nums[-2],最大的數乘了兩次:[6, 5, 7] 回傳 294,答案 210。另外還多寫了「有沒有正數」的分支,其實不需要。

正確解法
#

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

複雜度
#

時間 O(n log n),空間 O(1);只找最大三個和最小兩個可以做到 O(n)。

要特別避免的錯誤
#

  • 兩個負數相乘是正的,最小的兩個數也是候選。
  • index 要寫對:nums[-1] * nums[-2] * nums[-3]。

面試口說整理
#

排序後答案只有兩種:最大的三個相乘,或最小的兩個負數乘最大的數,取比較大的那個。時間 O(n log n);只掃一次記錄最大三個和最小兩個可以做到 O(n)。

相關文章

LeetCode 645: Set Mismatch
·1 分鐘
LeetCode Easy Array Hash-Table Bit-Manipulation Sorting
LeetCode 645 解題筆記:用總和算:missing = 1..n 的和 - set 的和,duplicate = 陣列總和 - set 的和
LeetCode 598: Range Addition II
·1 分鐘
LeetCode Easy Array Math
LeetCode 598 解題筆記:每次操作都包含左上角,被加最多次的是所有操作的交集:min(a) × min(b)
LeetCode 561: Array Partition
·1 分鐘
LeetCode Easy Array Greedy Sorting Counting-Sort
LeetCode 561 解題筆記:排序後相鄰兩個一組,每組的最小值就是偶數位置的數,加總
LeetCode 414: Third Maximum Number
·1 分鐘
LeetCode Easy Array Sorting
LeetCode 414 解題筆記:記錄三個不同的最大值,重複的數跳過;不到三個不同的數就回傳最大值
LeetCode 455: Assign Cookies
·1 分鐘
LeetCode Easy Array Two-Pointers Greedy Sorting
LeetCode 455 解題筆記:小孩和餅乾都排序,用最小的、夠大的餅乾滿足最小的小孩;兩個指標各走一次
LeetCode 268: Missing Number
·1 分鐘
LeetCode Easy Array Hash-Table Math Binary-Search
LeetCode 268 解題筆記:0 到 n 的總和減掉陣列總和就是缺的那個;缺的可能是 0