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

LeetCode 697: Degree of an Array

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

基本資料
#

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

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

解題思路
#

子陣列的 degree 要跟整個陣列一樣,就必須包含某個次數最多的數的所有出現位置,最短就是 last[x] - first[x] + 1。次數最多的數可能不只一個,要全部比較取最小(Hash Table 模板一)。一次掃描就能記錄次數、第一次和最後一次的位置。

我的嘗試
#

這題提交了 10 次:

  • 前三版只用 most_common()[0] 拿一個次數最多的數,次數相同的其他數沒有比;長度用負數 index 算,差了一:[2] 回傳 -1、0。
  • 改成記錄每個數所有出現的位置之後,又有 d.values 少了括號、拿 list 跟長度比較的錯誤,最後比較「位置 list 的長度」才 AC。

正確解法
#

class Solution:
    def findShortestSubArray(self, nums: List[int]) -> int:
        cnt, first, last = Counter(), {}, {}
        for i, x in enumerate(nums):
            cnt[x] += 1
            first.setdefault(x, i)
            last[x] = i
        degree = max(cnt.values())
        return min(last[x] - first[x] + 1 for x in cnt if cnt[x] == degree)

複雜度
#

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

要特別避免的錯誤
#

  • 次數最多的數可能有好幾個,要全部比較。
  • 長度是 last - first + 1。

面試口說整理
#

子陣列要包含某個次數最多的數的所有出現位置,所以我掃一次記錄每個數的次數、第一次和最後一次出現的位置,在次數最多的數裡取跨度最短的。時間 O(n)。

相關文章

LeetCode 645: Set Mismatch
·1 分鐘
LeetCode Easy Array Hash-Table Bit-Manipulation Sorting
LeetCode 645 解題筆記:用總和算:missing = 1..n 的和 - set 的和,duplicate = 陣列總和 - set 的和
LeetCode 599: Minimum Index Sum of Two Lists
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 599 解題筆記:把 list1 的字串對應到 index,掃 list2 時算兩邊 index 的和,留下和最小的全部字串
LeetCode 575: Distribute Candies
·1 分鐘
LeetCode Easy Array Hash-Table
LeetCode 575 解題筆記:最多只能吃 n / 2 顆,種類最多 len(set),答案是兩者的較小值
LeetCode 448: Find All Numbers Disappeared in an Array
·1 分鐘
LeetCode Easy Array Hash-Table
LeetCode 448 解題筆記:把陣列本身當雜湊表,看到 x 就把 nums[x - 1] 標成負數,最後還是正數的位置就是沒出現的數
LeetCode 268: Missing Number
·1 分鐘
LeetCode Easy Array Hash-Table Math Binary-Search
LeetCode 268 解題筆記:0 到 n 的總和減掉陣列總和就是缺的那個;缺的可能是 0
LeetCode 217: Contains Duplicate
·1 分鐘
LeetCode Easy Array Hash-Table Sorting
LeetCode 217 解題筆記:轉成 set 後長度變短就代表有重複