|
| 1 | +const coinChange = function (coins, target) { |
| 2 | + if (target === 0) return 0; |
| 3 | + |
| 4 | + let level = 0; |
| 5 | + let found = false; |
| 6 | + |
| 7 | + let queue = [...coins]; |
| 8 | + let visit = new Set(coins); |
| 9 | + |
| 10 | + while (queue.length > 0) { |
| 11 | + level++; |
| 12 | + |
| 13 | + const queueLength = queue.length; |
| 14 | + for (let i = 0; i < queueLength; i++) { |
| 15 | + const sum = queue.shift(); |
| 16 | + |
| 17 | + if (sum === target) { |
| 18 | + found = true; |
| 19 | + break; |
| 20 | + } |
| 21 | + |
| 22 | + for (let j = 0; j < coins.length; j++) { |
| 23 | + if (sum + coins[j] > target || visit.has(sum + coins[j])) continue; |
| 24 | + queue.push(sum + coins[j]); |
| 25 | + visit.add(sum + coins[j]); |
| 26 | + } |
| 27 | + } |
| 28 | + |
| 29 | + if (found) break; |
| 30 | + } |
| 31 | + |
| 32 | + if (found) return level; |
| 33 | + else return -1; |
| 34 | +}; |
| 35 | + |
| 36 | +console.log(coinChange([1, 2, 5], 11)); //3 |
| 37 | +console.log(coinChange([2], 3)); //-1 |
| 38 | +console.log(coinChange([1], 0)); //0 |
| 39 | + |
| 40 | +console.log(coinChange([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 40)); //4 |
| 41 | + |
| 42 | +console.log(coinChange([186, 419, 83, 408], 6249)); //20 |
| 43 | + |
| 44 | +console.log( |
| 45 | + coinChange([411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422], 9864) |
| 46 | +); //24 |
| 47 | + |
| 48 | +console.log(coinChange([1, 2], 3)); //2 |
0 commit comments