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

LeetCode 1570: Dot Product of Two Sparse Vectors

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

基本資料
#

難易度: medium 第一次嘗試:2026-02-10

  • 提交紀錄:Accepted(一次通過)

解題思路
#

稀疏向量大部分是 0,只存非零的 (index, value)。依 index 順序建立,列表本身就是排序的。

內積只有兩邊 index 相同的地方有貢獻,用雙指針合併:

  • index 相同:相乘加進答案,兩個都前進。
  • 否則 index 比較小的那個前進(另一邊在這個位置是 0)。

Follow-up:只有一邊是稀疏的:對稀疏的那邊逐一走過,在另一邊用二分搜尋找相同的 index(或直接用陣列 / 雜湊表查),時間 O(k log m),k 是稀疏那邊的非零數量。

我的嘗試
#

我 AC 的版本直接存整個陣列、用 zip 相乘,每次是 O(n),沒有用到「稀疏」這個條件。面試時這題就是要考怎麼存、怎麼合併,所以改成只存非零元素。

正確解法
#

class SparseVector:
    def __init__(self, nums: List[int]):
        self.pairs = [(i, x) for i, x in enumerate(nums) if x != 0]

    def dotProduct(self, vec: "SparseVector") -> int:
        a, b = self.pairs, vec.pairs
        i = j = 0
        res = 0
        while i < len(a) and j < len(b):
            if a[i][0] == b[j][0]:
                res += a[i][1] * b[j][1]
                i += 1
                j += 1
            elif a[i][0] < b[j][0]:
                i += 1
            else:
                j += 1
        return res

另一種常見寫法是存成 {index: value} 的雜湊表,對比較小的那個字典逐一查另一個。雜湊表寫起來比較短;雙指針版本不需要雜湊,只靠依 index 排序的列表。

複雜度
#

建立 O(n),內積 O(k1 + k2)(兩邊非零的數量),空間 O(k)。

要特別避免的錯誤
#

  • 直接存整個陣列:沒用到稀疏的特性。
  • index 不同時移動錯的指針:要移動 index 比較小的。

面試口說整理
#

我只存非零元素的 (index, value),依 index 排序。內積時用雙指針合併兩個列表,index 相同才相乘,否則移動 index 比較小的那個。時間是兩邊非零數量的總和。如果只有一邊稀疏,就走稀疏那邊,在另一邊用二分搜尋或直接索引查。

相關文章

LeetCode 244: Shortest Word Distance II
·1 分鐘
LeetCode Medium Two-Pointers Design Hash-Table String Array
LeetCode 244 解題筆記:預處理每個字的出現位置(天然排序),查詢時對兩個位置列表做雙指針合併,每次移動比較小的那個
LeetCode 923: 3Sum With Multiplicity
·3 分鐘
LeetCode Medium Two-Pointers Sorting Hash-Table Counting Array
LeetCode 923 解題筆記:排序後固定第一個數、對撞指針找另外兩個;兩端值相同時用組合數一次算完,不同時把兩端各自的重複數相乘
LeetCode 1229: Meeting Scheduler
·1 分鐘
LeetCode Medium Two-Pointers Sorting Array
LeetCode 1229 解題筆記:兩個人的時段各自排序後,跟 986 一樣用雙指針找交集;第一個長度夠的交集就是最早的時段
LeetCode 442: Find All Duplicates in an Array
·1 分鐘
LeetCode Medium Hash-Table Array
LeetCode 442 解題筆記:值在 1..n,用 nums[v-1] 的負號記錄 v 出現過;第二次遇到時它已經是負的
LeetCode 809: Expressive Words
·2 分鐘
LeetCode Medium Two-Pointers String Array
LeetCode 809 解題筆記:兩個指針一段一段比對連續相同字元的長度;長度不同時,s 的那段必須至少 3 個且不少於 word;最後兩個字串都要剛好走完
LeetCode 1989: Maximum Number of People That Can Be Caught in Tag
·1 分鐘
LeetCode Medium Two-Pointers Greedy Array
LeetCode 1989 解題筆記:鬼從左到右,每個鬼抓範圍內最左邊、還沒被抓的人;用一個只往右走的指針指向下一個候選人