Dùng Set và filter để lấy giao của hai mảng ngắn gọn, hiệu năng tốt (O(n+m)).
Ví dụ minh họa
<html>
<body>
<script>
let intersection = function(x, y) {
x = new Set(x), y = new Set(y);
return [...x].filter(k => y.has(k));
};
document.write(intersection([5,7,4,8], [3,9,8,4,3])); // Kết quả: 8,4
</script>
</body>
</html>
Giải thích
- Chuyển mảng thành
Set→ loại trùng lặp, tra cứu O(1). - Duyệt set
x([...x]), giữ phần tử có trong sety(y.has(k)). - Kết quả là mảng các phần tử chung, không trùng, theo thứ tự xuất hiện đầu tiên trong
x.
Các biến thể
// Giữ trùng lặp (nếu cần)
function intersectionWithDuplicates(a, b) {
const setB = new Set(b);
return a.filter(x => setB.has(x));
}
// ES2023+ (proposal) - có thể dùng Array.prototype.intersection() tương lai
// const result = array1.intersection(array2);
Hiệu năng
- Thời gian: O(n + m)
- Không gian: O(n + m) cho hai Set
- Tốt hơn lồng vòng lặp O(n*m) hoặc
indexOfO(n*m).