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

LeetCode 747: Largest Number At Least Twice of Others

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

基本資料
#

難易度: easy 第一次嘗試:2022-09-03

  • 提交紀錄:Runtime Error → Wrong Answer → Runtime Error ×2 → Wrong Answer → Accepted → Runtime Error ×2 → Wrong Answer → Runtime Error → Accepted → Runtime Error → Wrong Answer ×2 → Runtime Error → Accepted ×2

解題思路
#

只要最大值至少是第二大的兩倍,就一定至少是其他每個數的兩倍(Greedy 模板一)。掃一次記錄最大值、它的 index 和第二大:新的數比最大值大,舊的最大值就變第二大;否則才跟第二大比。比較用 max >= 2 * second,不用除法,第二大是 0 也沒問題。

我的嘗試
#

這題提交了 17 次:

  • 一開始用除法 max_ / max(nums),其他數是 0 時 ZeroDivisionError,用 set(nums) == {0} 特判才 AC。
  • 改寫成一次掃描找最大和第二大,第二個判斷寫成 if 而不是 elif,最大值剛更新完又被拿去更新第二大,第二大變成最大值本身:[7, 0] 回傳 -1,答案 0。另外幾版回傳了值而不是 index,或還在用除法。改成 elif 和 max_ >= 2 * sec_max 才 AC。

正確解法
#

class Solution:
    def dominantIndex(self, nums: List[int]) -> int:
        first = second = -1
        idx = -1
        for i, x in enumerate(nums):
            if x > first:
                first, second, idx = x, first, i
            elif x > second:
                second = x
        return idx if first >= 2 * second else -1

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 用乘法比較,除法遇到 0 會出錯。
  • 更新第二大要用 elif,不然最大值會被當成第二大。
  • 回傳的是 index,不是值。

面試口說整理
#

最大值只要至少是第二大的兩倍,就一定至少是其他每個數的兩倍,所以我掃一次記錄最大值、它的 index 和第二大,最後用乘法比較,避免除以 0。時間 O(n)、空間 O(1)。

相關文章

LeetCode 628: Maximum Product of Three Numbers
·1 分鐘
LeetCode Easy Array Math Sorting
LeetCode 628 解題筆記:排序後答案只有兩種可能:最大的三個相乘,或最小的兩個(負數)乘最大的一個
LeetCode 645: Set Mismatch
·1 分鐘
LeetCode Easy Array Hash-Table Bit-Manipulation Sorting
LeetCode 645 解題筆記:用總和算:missing = 1..n 的和 - set 的和,duplicate = 陣列總和 - set 的和
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 217: Contains Duplicate
·1 分鐘
LeetCode Easy Array Hash-Table Sorting
LeetCode 217 解題筆記:轉成 set 後長度變短就代表有重複