pwstrick / daily

一份搜集的前端面试题目清单、面试相关以及各类学习的资料(不局限于前端)
2.39k stars 242 forks source link

零钱兑换 #1058

Open pwstrick opened 4 years ago

pwstrick commented 4 years ago

322. 零钱兑换

/**
 * @param {number[]} coins
 * @param {number} amount
 * @return {number}
 */
var coinChange = function(coins, amount) {
    if(amount == 0)
        return 0;
   let len = coins.length,
    min = Number.MAX_VALUE,
    dp = [new Array(amount)];
  for (let j = 1; j <= amount; j++) {   //初始化第一行
    dp[0][j] = (coins[0] > j || (j % coins[0]) > 0) ? 0 : (j / coins[0]);
  }
  for (let i = 1; i < len; i++) {
    dp[i] = [];
    for (let j = 1; j <= amount; j++) {
      let rest = j - coins[i];
      if(rest == 0) {       //
        dp[i][j] = 1;
        continue;
      }
      if(rest < 0) {
        dp[i][j] = dp[i-1][j];
        continue;
      }
      if(dp[i-1][j] > 0 && dp[i][rest] > 0) {
        dp[i][j] = Math.min(dp[i-1][j], dp[i][rest] + 1);
      }else if(dp[i-1][j] > 0) {
        dp[i][j] = dp[i-1][j];
      }else if(dp[i][rest] > 0) {
        dp[i][j] = dp[i][rest] + 1;
      }else {
        dp[i][j] = 0;
      }
    }
  }
  for(let i = 0; i < len; i++) {
    if(dp[i][amount] == 0) {
      continue;
    }
    if(dp[i][amount] > 0) {
      min = Math.min(min, dp[i][amount]);
    }
  }
  return min == Number.MAX_VALUE ? -1 : min;
};