0
点赞
收藏
分享

微信扫一扫

279. 完全平方数,322. 零钱兑换

279. 完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

 

示例 1:

12
12 = 4 + 4 + 4

示例 2:

13
13 = 4 + 9


提示:

  • 1 <= n <= 104


class Solution {
    public int numSquares(int target) {
        if(target==0|target==1){
            return 1;
        }
        //构造完全平方数数组
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < target; i++) {
            if(i*i<=target){
                list.add(i*i);
            }else break;
        }
        int size = list.size();
        int[][] dp = new int[size][target + 1];
        for (int i = 1; i <= target; i++) {
            dp[1][i] = i;
        }

        for (int i = 2; i < size; i++) {
            for (int j = 1; j <= target; j++) {
                Integer num = list.get(i);
                if(j<num){
                    dp[i][j] = dp[i - 1][j];
                }else if(num==j){
                    dp[i][j] = 1;
                }else {
                    dp[i][j] = Math.min(dp[i][num] + dp[i][j - num],dp[i - 1][j]);
                }
            }
        }
        return dp[size-1][target];
    }
}

322. 零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

 

示例 1:

[1, 2, 5]
11
3

示例 2:

[2]
3

示例 3:

输入:coins = [1], amount = 0
输出:0

 

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1];
        Arrays.fill(dp, amount + 1); // 初始化为一个比amount大的数,表示当前金额无法被凑成,或者需要无限多的硬币
        dp[0] = 0; // 金额为0时,不需要任何硬币

        for (int i = 1; i <= amount; i++) {
            for (int coin : coins) {
                if (i - coin >= 0) {
                    dp[i] = Math.min(dp[i], dp[i - coin] + 1);
                }
            }
        }

        return dp[amount] > amount ? -1 : dp[amount];
    }
}

举报

相关推荐

0 条评论