1. 程式人生 > >leetCode 349號題目 兩個陣列的交集 ,兩種方式實現, 複雜度分別為O(n^2) 和 O(n)

leetCode 349號題目 兩個陣列的交集 ,兩種方式實現, 複雜度分別為O(n^2) 和 O(n)

給定兩個陣列,編寫一個函式來計算它們的交集。

示例 1:

輸入: nums1 = [1,2,2,1], nums2 = [2,2]
輸出: [2]
示例 2:

輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出: [9,4]
說明:

輸出結果中的每個元素一定是唯一的。
我們可以不考慮輸出結果的順序。

原題如上:

第一種暴力方法,雙層遍歷如程式碼 複雜度為O(n^2), 數量級標比較大就很慢

class Solution:
    def intersection(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        nums1, nums2 = list(set(nums1)), list(set(nums2))
        back = []
        for num2 in nums2:
            if num2 in nums1:
                back.append(num2)
        return back


if __name__ == "__main__":
    a = Solution()

    nums1 = [1,3,2]
    nums2 = [3,3,4]
    print(a.intersection(nums1, nums2))

第二種方法, 把第一個陣列倒置成一個元組, 就形成了索引, 速度自然就提高了

複雜度分析: 第一個陣列遍歷一次, 構建索引 複雜度O(n)

                    第二個陣列遍歷一次, 每次遍歷比對第一個陣列的key, 如果為1 表示存在,   這裡複雜度是O(1)*O(n)

                  總公複雜度是O(n)+O(1)*O(n)  =  2O(n)  =  O(n)

其中要注意的是, 要把第二個list取唯一值才能保證唯一

class Solution:
    def intersection(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        nums2 = list(set(nums2))
        back = []
        dictNums1 = {}
        for num1 in nums1:
            dictNums1[num1] = 1

        for num2 in nums2:
            if dictNums1.get(num2) == 1:
                back.append(num2)
        return back

if __name__ == '__main__':
    a = Solution();
    print(a.intersection([2,3,1,2,3], [3,2,3,4]))