350. 兩個陣列的交集 II (python)
阿新 • • 發佈:2019-02-03
一. 題目
給定兩個陣列,寫一個方法來計算它們的交集。
例如:
給定nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2, 2]
.
注意:
- 輸出結果中每個元素出現的次數,應與元素在兩個陣列中出現的次數一致。
- 我們可以不考慮輸出結果的順序。
跟進:
- 如果給定的陣列已經排好序呢?你將如何優化你的演算法?
- 如果 nums1 的大小比 nums2 小很多,哪種方法更優?
- 如果nums2的元素儲存在磁碟上,記憶體是有限的,你不能一次載入所有的元素到記憶體中,你該怎麼辦?
二. 思路及實現程式碼
1) 自己思路
找出長度最短的list1,然後迴圈list1判斷每一項是否在list2裡。因為題幹要求了出現次數一致,所以如果list1某一項在list2裡,那麼list2要remove這一項,否則次數會不一致。
list.remove(i), remove the first item which value is equal to i in the list. 所以可以很好的應用在這。
被註釋掉的是範例程式碼,比較簡潔可以學習一下。
class Solution(object): def intersect(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: List[int] """ # n1 = nums2 if len(nums1)>=len(nums2) else nums1 # n2 = nums2 if len(nums1)<len(nums2) else nums1 # ans = [] # for i in n1: # if i in n2: # ans.append(i) # n2.remove(i) # return ans temp_list = [] if len(nums1) < len(nums2): for items in nums1: if items in nums2: temp_list.append(items) nums2.remove(items) else: for items in nums2: if items in nums1: temp_list.append(items) nums1.remove(items) return temp_list
2)別人思路
1> 用時最短範例
排序,雙指標
class Solution(object): def intersect(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: List[int] """ ans = [] nums1.sort() nums2.sort() i = j = 0 while i<len(nums1) and j < len(nums2): if nums1[i] == nums2[j]: ans.append(nums1[i]) i+=1 j+=1 elif nums1[i] < nums2[j]: i+=1 else: j+=1 return ans
值得學習的點:用了三支條件語句,代替了在開始判斷陣列長度的操作。
具體為,因為兩隻陣列已經按升序排好序,所以當 i 指標和 j 指標指向的數值相等時,放入新list;如果 i 指標指向的數 < j 指標指向的數,那麼 i 指標前進;如果 i 指標指向的數 > j 指標指向的數,那麼 j 指標前進; 錯位遍歷。