給定兩個數組,編寫一個函數來計算它們的交集。
示例 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]))