1. 程式人生 > 實用技巧 >leetcode348&350之計算兩個陣列的交集

leetcode348&350之計算兩個陣列的交集

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

示例 1:

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

示例 2:

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

說明:

  • 輸出結果中的每個元素一定是唯一的。
  • 我們可以不考慮輸出結果的順序。
350、給定兩個陣列,編寫一個函式來計算它們的交集。

示例 1:

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

示例 2:

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

來源:leetcode
程式碼實現:
 1 from collections import Counter
 2 
 3 
 4 def instersection(nums1, nums2):
 5     '''
 6     計算兩個陣列的交集
 7     :param nums1:
 8     :param nums2:
 9     :return:
10     '''
11     return list(set(nums1) & set(nums2))
12 
13 
14 print("------測試intersection()--------")
15 nums1 = [4, 9, 5]
16 nums2 = [9, 4, 9, 8, 4]
17 res = instersection(nums1, nums2) 18 print(res) 19 20 21 def intersect(nums1, nums2): 22 res = [] 23 for i in nums1: 24 if i in nums2: 25 nums2.remove(i) 26 res.append(i) 27 return res 28 29 30 print("------測試intersect()-------") 31 nums1 = [4, 9, 5]
32 nums2 = [9, 4, 9, 8, 4] 33 res = intersect(nums1, nums2) 34 print("res=", res) 35 36 37 def intersect1(nums1, nums2): 38 res = {} 39 for num in nums1: 40 if res.get(num) == None: 41 res[num] = 1 42 else: 43 res[num] += 1 44 print(res) 45 46 result = [] 47 for num in nums2: 48 if num in res and res[num] != 0: 49 result.append(num) 50 res[num] -= 1 51 else: 52 continue 53 return result 54 55 56 print("------測試intersect1()-------") 57 nums1 = [4, 9, 5] 58 nums2 = [9, 4, 9, 8, 4] 59 result = intersect1(nums1, nums2) 60 print("result=", result)

輸出:

------測試intersection()--------
[9, 4]
------測試intersect()-------
res= [4, 9]
------測試intersect1()-------
{4: 1, 9: 1, 5: 1}
result= [9, 4]

總結:349考慮重複元素,當元素重複出現時,只輸出一個就行了,藉助set很容易實現。return list(set(nums1)&set(nums2))。set間的&表示兩集和求交集

350當元素重複時,輸出結果元素出現次數應與每個元素在兩列表中出現的最低次數一致。程式碼中採用兩種方法來實現

新的知識點:

collections.Counter統計迭代器中元素個數,可以將Counter轉為dict,遍歷dict和hash表空間複雜度為O(1),遍歷列表空間複雜度為O(N)