1. 程式人生 > >Leetcode-探索 | 兩個數組的交集 II

Leetcode-探索 | 兩個數組的交集 II

事情 bug 輔助 存儲空間 暴力 技巧 常用 code 思考

給定兩個數組,寫一個方法來計算它們的交集。

例如:
給定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].

註意:

  • 輸出結果中每個元素出現的次數,應與元素在兩個數組中出現的次數一致。
  • 我們可以不考慮輸出結果的順序。

跟進:

    • 如果給定的數組已經排好序呢?你將如何優化你的算法?
    • 如果 nums1 的大小比 nums2 小很多,哪種方法更優?
    • 如果nums2的元素存儲在磁盤上,內存是有限的,你不能一次加載所有的元素到內存中,你該怎麽辦?

——————————————————————————————————————————————

1. 如果考慮就地處理且不進行預處理的的話思路有限,一開始暴力算法也寫得磕磕絆絆,下面是未完成debug的代碼:

 1 class Solution(object):
 2     def intersect(self, nums1, nums2):
 3         """
 4         :type nums1: List[int]
 5         :type nums2: List[int]
 6         :rtype: List[int]
 7         """
 8         alen1 = len(nums1)
 9         alen2 = len(nums2)
10 res = [] 11 12 i = j = 0 13 while i < alen1: 14 j = 0 15 while j < alen2: 16 if nums1[i] == nums2[j]: 17 res.append(nums1[i]) 18 alen1 -= 1 19 alen2 -= 1 20 if
alen1 < 1 or alen2 < 1: 21 return res 22 23 if i < alen1: 24 nums1[i] = nums1[alen1] 25 i -= 1 26 if j < alen2: 27 nums2[j] = nums2[alen2] 28 29 j += 1 30 i += 1 31 32 return res

2. 這種情況下要提醒自己此路不通另尋他途,因為算法設計本身並不是一個專精於技巧的事情,要以解決問題為目的,而評價標準也無外乎時空復雜度和算法的簡潔性,易理解的特性,魯棒性等,思考方式要依循數據結構的特點和常用的解決問題的模式/工具/思路方法。這裏是否可以使用額外的輔助存儲空間解決?

3. 預處理的辦法就比較簡單了:

4. 一個新元素的引進:哈希。本質上還是引入了一個額外的輔助存儲空間,而這個輔助存儲空間是一個特殊的數據結構,具有可以隨機訪問多個同鍵值元素的特性

Leetcode-探索 | 兩個數組的交集 II