สมมติว่าเราได้รับชุดหมายเลขผู้สมัคร (ไม่ซ้ำกัน) และหมายเลขเป้าหมาย (เป้าหมาย)
เราจำเป็นต้องเขียนฟังก์ชันที่ค้นหาชุดค่าผสมที่ไม่ซ้ำกันทั้งหมดในผู้สมัครโดยที่หมายเลขของผู้สมัครรวมเข้ากับเป้าหมาย
โดยสามารถเลือกหมายเลขซ้ำจากผู้สมัครได้ไม่จำกัดจำนวนครั้ง
หมายเหตุ −
-
ตัวเลขทั้งหมด (รวมทั้งเป้าหมาย) จะเป็นจำนวนเต็มบวก
-
ชุดโซลูชันต้องไม่มีชุดค่าผสมที่ซ้ำกัน
ตัวอย่าง −
หากอินพุตเป็น −
candidates = [2,3,6,7], target = 7,
วิธีแก้ไขคือ −
[ [7], [2,2,3] ];
เนื่องจากปัญหาคือการได้ผลลัพธ์ที่เป็นไปได้ทั้งหมด ไม่ใช่ผลลัพธ์ที่ดีที่สุดหรือจำนวนผลลัพธ์ เราจึงไม่จำเป็นต้องพิจารณา Dynamic Programming จึงจำเป็นต้องใช้วิธีการย้อนรอยโดยใช้การเรียกซ้ำเพื่อจัดการกับมัน
ตัวอย่าง
ต่อไปนี้เป็นรหัส -
const recursiveSum = (
candidates,
remainingSum,
finalCombinations = [],
currentCombination = [],
startFrom = 0,
) => {
if (remainingSum < 0) {
return finalCombinations;
}
if (remainingSum === 0) {
finalCombinations.push(currentCombination.slice());
return finalCombinations;
}
for (let candidateIndex = startFrom; candidateIndex < candidates.length; candidateIndex += 1) {
const currentCandidate = candidates[candidateIndex];
currentCombination.push(currentCandidate);
recursiveSum(
candidates,
remainingSum - currentCandidate,
finalCombinations,
currentCombination,
candidateIndex,
);
currentCombination.pop();
}
return finalCombinations;
}
const combinationSum = (candidates, target) => recursiveSum(candidates, target);
console.log(combinationSum([2, 3, 6, 7], 7)); ผลลัพธ์
ต่อไปนี้เป็นผลลัพธ์บนคอนโซล -
[ [ 2, 2, 3 ], [ 7 ] ]