[Swift]LeetCode350. 两个数组的交集 II | Intersection of Two Arrays II
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9769123.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Given two arrays, write a function to compute their intersection.
Example 1:
Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2,2]
Example 2:
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [4,9]
Note:
- Each element in the result should appear as many times as it shows in both arrays.
- The result can be in any order.
Follow up:
- What if the given array is already sorted? How would you optimize your algorithm?
- What if nums1's size is small compared to nums2's size? Which algorithm is better?
- What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?
1 class Solution { 2 func intersect(_ nums1: [Int], _ nums2: [Int]) -> [Int] { 3 //定义两个指针 4 var cur1:Int = 0 5 var cur2:Int = 0 6 var res:[Int] = [Int]() 7 var arr1: Array<Int> = nums1 8 var arr2: Array<Int> = nums2 9 //排序 10 arr1.sort(){$0 < $1} 11 arr2.sort(){$0 < $1} 12 while(cur1 < arr1.count && cur2 < arr2.count) 13 { 14 var num1 = arr1[cur1] 15 var num2 = arr2[cur2] 16 if num1 == num2 17 { 18 res.append(num1) 19 cur1 += 1 20 cur2 += 1 21 } 22 else if num1 < num2 23 { 24 cur1 += 1 25 } 26 else 27 { 28 cur2 += 1 29 } 30 } 31 return res 32 } 33 }
12ms
1 class Solution { 2 func intersect(_ nums1: [Int], _ nums2: [Int]) -> [Int] { 3 var frequency = Dictionary( nums1.map{ ($0, 1) }, uniquingKeysWith: +) 4 var results = [Int]() 5 for num in nums2 { 6 if let value = frequency[num], value > 0 { 7 frequency[num] = value - 1 8 results.append(num) 9 } 10 } 11 return results 12 } 13 }
16ms
1 class Solution { 2 func intersect(_ nums1: [Int], _ nums2: [Int]) -> [Int] { 3 var map: [Int: Int] = [:] 4 for num in nums1 { 5 if let count = map[num] { 6 map[num] = count + 1 7 } else { 8 map[num] = 1 9 } 10 } 11 12 var result: [Int] = [] 13 for num in nums2 { 14 if let count = map[num], count >= 1 { 15 result.append(num) 16 map[num] = count - 1 17 } 18 } 19 return result 20 } 21 }
20ms
1 class Solution { 2 func intersect(_ nums1: [Int], _ nums2: [Int]) -> [Int] { 3 var nums1 = nums1.sorted(by: <) 4 var nums2 = nums2.sorted(by: <) 5 6 var i:Int = 0, j:Int = 0 7 8 var n1:Int = 0, n2:Int = 0 9 10 var results:[Int] = Array() 11 12 while i < nums1.count && j < nums2.count { 13 n1 = nums1[i] 14 n2 = nums2[j] 15 if n1 < n2 { 16 i += 1 17 }else if n1 > n2 { 18 j += 1 19 }else { 20 results.append(n1) 21 i += 1 22 j += 1 23 } 24 } 25 return results 26 } 27 }
20ms
1 class Solution { 2 3 func intersect(_ nums1: [Int], _ nums2: [Int]) -> [Int] { 4 var dic = [Int: Int]() 5 var result = [Int]() 6 for value in nums1{ 7 if dic[value] != nil { 8 dic[value]! += 1 9 }else{ 10 dic[value] = 1 11 } 12 } 13 for value in nums2 { 14 if dic[value] != nil && dic[value] != 0{ 15 result.append(value) 16 dic[value]! -= 1 17 } 18 } 19 return result 20 } 21 }