1. 程式人生 > >350. 兩個陣列的交集 II (python)

350. 兩個陣列的交集 II (python)

一. 題目

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

例如:
給定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 指標前進; 錯位遍歷。