问题
找出两个数组的共同元素。
解决
方案一
最开始想到的办法是外循环+内循环遍历,算法复杂度是 O(N2)。如果用个键值对象来保存第一个数组,另一个数组遍历一遍就得到结果了。算法复杂度是O(2N) = O(N)。
let array1 = [1, 3, 4, 5, 6, 8, 9, 10]
let array2 = [2, 3, 6, 8, 11, 14, 19]
var map = [Int: Bool]()
for item in array1 {
map[item] = true
}
for item in array2 {
if let b = map[item], b {
print("\(item)")
}
}
输出
3
6
8
方案二
在 Cocoa 的环境下,可以把数组放到一个 NSSet 中,然后用 .contains() 来判断是否包含某对象。因为 NSSet 的内部实现是一个无序 Hash 表,每一个查询的时间复杂度是 O(1),遍历一遍查询的时间复杂度是 O(N)。
let set = NSSet(array: array1)
for item in array2 where set.contains(item){
print(item)
}