Chúng ta cần viết một hàm JavaScript nhận vào một mảng số làm đối số đầu tiên và một số làm đối số thứ hai. Hàm nên chuẩn bị và trả về một mảng tất cả các bộ ba (liên tiếp hoặc không liên tiếp), mà cộng lại cho số được chỉ định bởi đối số thứ hai.
Ví dụ:
Nếu mảng đầu vào và số là:
const arr = [4, 2, 0, 1, 2, 6, 8, 3, 2, 5]; const num = 8;
Thì mảng đầu ra nên là:
const output = [ [ 2, 2, 4 ], [ 1, 3, 4 ], [ 0, 2, 6 ], [ 1, 2, 5 ] ];
Ví dụ
Dưới đây là mã nguồn:
const arr = [4, 2, 0, 1, 2, 6, 8, 3, 2, 5]; const num = 8; const tripletSum = (arr, num) => { if (arr.length === 3) { if (arr[0]+arr[1]+arr[2] === 0) { return [[arr[0],arr[1],arr[2]]]; }; }; const results = []; const hashMap = {}; for (var i=0; i<arr.length; i++) { for (var j=i+1; j<arr.length; j++) { for (var k=j+1; k<arr.length; k++) { if (arr[i]+arr[j]+arr[k] === num) { if (!hashMap[arr[i]*arr[j]*arr[k]]) { results.push([arr[i],arr[j],arr[k]]); results[results.length-1].sort(); hashMap[arr[i]*arr[j]*arr[k]] = true; } } } } } return results; }; console.log(tripletSum(arr, num));Kết quả
Đầu ra trên console:
[ [ 2, 2, 4 ], [ 1, 3, 4 ], [ 0, 2, 6 ], [ 1, 2, 5 ] ]
Lưu ý: Code dùng 3 vòng lặp O(n³) + hashMap khử trùng bằng tích (có thể va chạm). Tối ưu: sort mảng + two-pointer O(n²) cho 3Sum. Hash key nên dùng string a+','+b+','+c an toàn hơn tích.