我的第一反应解法是这样的:
const fun = ((arr1, arr2) => arr1.filter((i) => arr2.includes(i)));
但是当两个数组中存在大量相同元素的时候是有问题的。
例如fun([1,1],[1])
会得到[1,1]
。
- 空间换时间,借助
hash
实现,时间复杂度为O(m+n)
const join = (arr1, arr2) => {
const hash = {};
const result = [];
arr1.forEach((n) => {
hash[n] = (hash[n] || 0) + 1;
});
arr2.forEach((n) => {
if (hash[n] > 0) {
result.push(n);
hash[n]--;
}
});
return result;
};
- 不使用额外空间,遍历数组1的元素,当在数组2中找到时就从数组2中删除该元素并继续遍历数组1的下一个元素,时间复杂度为
O(m*n)
const join = (arr1, arr2) => {
const result = [];
for (let i = 0; i < arr1.length; i++) {
for (let j = 0; j < arr2.length; j++) {
if (arr1[i] === arr2[j]) {
result.push(arr2[j]);
arr2.splice(j, 1);
break;
}
}
}
return result;
};
网友评论