Description

給定兩個整數陣列 nums1nums2,回傳大小為 2 的列表 answeranswer[0]nums1 中不在 nums2 的所有不重複元素,answer[1]nums2 中不在 nums1 的所有不重複元素。

Example:

Input: nums1 = [1,2,3], nums2 = [2,4,6] Output: [[1,3],[4,6]]

Intuition#

核心思路:將兩個陣列各轉成 Set,然後做集合差集運算。

  • Set 天然去重,且支援 O(1) 查找
  • set1 - set2 得到只在 nums1 中的元素
  • set2 - set1 得到只在 nums2 中的元素

Approaches#

1: Brute Force#

  • 概念: 對 nums1 中每個元素檢查是否在 nums2 中,反之亦然
  • 時間複雜度: O(n * m) - 雙層遍歷
  • 空間複雜度: O(n + m) - 結果列表
class Solution {
    fun findDifference(nums1: IntArray, nums2: IntArray): List<List<Int>> {
        val diff1 = mutableSetOf<Int>()
        val diff2 = mutableSetOf<Int>()

        for (n in nums1) {
            if (n !in nums2) diff1.add(n)
        }
        for (n in nums2) {
            if (n !in nums1) diff2.add(n)
        }

        return listOf(diff1.toList(), diff2.toList())
    }
}

⭐2: HashSet Difference#

  • 概念: 轉成 Set 後直接用集合差集
  • 時間複雜度: O(n + m) - 建 Set + 差集運算
  • 空間複雜度: O(n + m) - 兩個 Set
class Solution {
    fun findDifference(nums1: IntArray, nums2: IntArray): List<List<Int>> {
        val set1 = nums1.toHashSet()
        val set2 = nums2.toHashSet()

        return listOf(
            (set1 - set2).toList(),
            (set2 - set1).toList()
        )
    }
}

Kotlin 的 Set 支援 - 運算子做差集,語法簡潔。底層是 O(n) 遍歷較小集合,對每個元素做 O(1) 查找。

🔑 Takeaways#

  • Pattern: 集合差異 / 對稱差 -> HashSet 差集運算
  • 關鍵技巧: Kotlin 的集合運算子(-intersectunion)讓程式碼非常簡潔。記得先轉 Set 去重