• 刷题11.27


    1 爬楼梯

    题目

    假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
    每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

    代码

    class Solution {
        public int climbStairs(int n) {
            int[] dp=new int[n+1];
            dp[0]=1;
            for(int i=1; i<=n; i++)
                for(int j=1;j<=2;j++){
                    if(i-j>=0)
                        dp[i]+=dp[i-j];
                }         
            return dp[n];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    总结

    假如每次可以爬1,2,3,……,m个楼梯,求有多少种方法到楼顶。
    (将j的限制2变为m)
    组合不强调顺序,排列强调顺序,这题求得是排列总和。
    求排列总和,先遍历背包,再遍历物品。

    2 零钱兑换

    题目

    给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
    计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
    你可以认为每种硬币的数量是无限的。

    代码

    class Solution {
        public int coinChange(int[] coins, int amount) {
            int max=Integer.MAX_VALUE;
            int[] dp=new int[amount+1];
            for(int i=0;i=0 && dp[i-coins[j]]!=max) dp[i]=Math.min(dp[i],dp[i-coins[j]]+1);
                }
            if(dp[amount]==max) return -1;
            return dp[amount]; 
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    总结

    dp[j]:凑足总额为j所需钱币的最少个数为dp[j]
    递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
    dp数组初始化:
    首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;
    考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。所以下标非0的元素都是应该是最大值。

    初始化我没想对~~~~我想的是coins[i]对应的dp[coins[i]]=1,其他下标0,然后递推

    3 完全平方数

    题目

    给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
    完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

    代码

    class Solution {
        public int numSquares(int n) {
            int max=Integer.MAX_VALUE;
            int[] dp=new int[n+1];
            for(int i=0;i=0 && dp[i-j*j]!=max)
                        dp[i]=Math.min(dp[i],dp[i-j*j]+1);
                }
            return dp[n];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    总结

    和零钱兑换凑足总额的最小数额那道题一样。
    我没想到j的限制是j*j<=n
    还想着要不要从1循环到n,然后判断他是不是完全平方数,可是这样肯定会超时吧。哎,没想到 物品怎么循环。

  • 相关阅读:
    .NET Core + ELK 搭建可视化日志分析平台(下)
    Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表、地图)
    【广州华锐互动】VR党建多媒体互动展厅:随时随地开展党史教育
    1认识一下防火墙
    SpringBoot源码深度解析(三):SpringBoot启动流程原理详解
    springboot mongodb 数据添加时更改‘_class‘字段
    LeetCode 0155. 最小栈
    组合数学笔记-特殊计数数列
    水产行业智能供应链管理平台解决方案:支撑企业供应链数字化,提升企业管理效益
    qml调用js代码演示
  • 原文地址:https://blog.csdn.net/wt_1551/article/details/128064366