Leetcode-探索 | 兩個數組的交集 II
阿新 • • 發佈:2018-06-29
事情 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 ifalen1 < 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