Leetcode DAY 45:爬楼梯 (进阶)and 零钱兑换 and 完全平方数

  • 70. 爬楼梯 (进阶)

~ 程序未通过原因: 先遍历背包再遍历物品 没有考虑到背包容量必须大于物品重量这一条件

成功通过代码:

class Solution {
public:
    int climbStairs(int n) {
        // dp[i]表示爬到i的台阶的顶楼 有几种排列方式
        vector dp(n + 1, 0);
        dp[0] = 1;
        for(int i = 0; i <= n; i++)
        {
            for(int j = 1; j <= 2 && i >= j; j++)
            {
                dp[i] += dp[i - j];
            }
        }
        return dp[n];
    }
};
  • 322. 零钱兑换

~程序未通过原因:这个错误是由于整数溢出导致的。在这种情况下,代码试图在 int 类型的最大值 21474836471 之间进行加法运算,这超出了 int 类型的范围,因此导致未定义的行为。这个错误可能会导致程序崩溃或输出错误的结果,需要注意检查代码中是否存在类似的整数溢出问题。

必须加上  if(i - coins[j] >= 0 && dp[i - coins[j]] != INT_MAX)

成功通过代码:

class Solution {
public:
    int coinChange(vector& coins, int amount) {
        // dp[i] 表示的装满容量为i的背包最少需要多少个物品
        // dp[i] = min(dp[i], dp[i - coins[j]] + 1)
        vector dp(amount + 1, INT_MAX);
        dp[0] = 0;
        // 先遍历背包
        for(int i = 1; i <= amount; i++)
        {
            for(int j = 0; j < coins.size(); j++)
            {
                if(i - coins[j] >= 0 && dp[i - coins[j]] != INT_MAX)
                {
                   dp[i] = min(dp[i], dp[i - coins[j]] + 1); 
                }
            }
        }
        if(dp[amount] == INT_MAX) return -1;
        else return dp[amount];
    }
};
  • 279.完全平方数

一次直接AC

class Solution {
public:
    int numSquares(int n) {
        // dp[i] 表示装满容量为i的背包需要用到的最少物品数量
        // dp[i] = min(dp[i], dp[i - nums[j]] + 1)
        vector dp(n + 1, INT_MAX);
        dp[0] = 0;
        vector nums(100);
        for(int i = 1; i <= 100; i++)
        {
            nums[i - 1] = i * i;
        }
        for(int i = 0; i <= n; i++)
        {
            for(int j = 0; j < 100; j++)
            {
                if(i - nums[j] >= 0 && dp[i - nums[j]] != INT_MAX)
                {
                    dp[i] = min(dp[i], dp[i - nums[j]] + 1);
                }
            }
        }
        return dp[n];
    }
};

你可能感兴趣的:(leetcode,算法,职场和发展)