小鸡玩算法-力扣HOT100-动态规划(上)

一.爬楼梯

问题概述:

思路:

1级台阶1种情况,2级台阶2情况,3级台阶要么是2级台阶再爬1格,要么是1级台阶爬2格,所以是1级和2级情况和,同理4级台阶是3级和2级情况合。

代码:

java 复制代码
class Solution {
    public int climbStairs(int n) {

        if(n==1){
            return 1;
        }
        
        if(n==2){
            return 2;
        }
        
         int[] a=new int[n];

         a[0]=1;
         a[1]=2;

         for(int i=2;i<n;i++){
            a[i]=a[i-1]+a[i-2];
         }

         return a[n-1];

    }
}

二.杨辉三角

问题概述:

思路:

每一行起始位置和对角线都为1。剩余的都是其上+上左.

代码:

java 复制代码
class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> a=new ArrayList<List<Integer>>();

        for(int i=0;i<numRows;i++){
            List<Integer> b=new ArrayList<Integer>();
            for(int j=0;j<=i;j++){
                if(j==0||i==j){
                    b.add(1);
                }else{
                    b.add(a.get(i-1).get(j)+a.get(i-1).get(j-1));
                }
            }
            a.add(b);
        }

        return a;
        
    }
}

三.打家劫舍

问题概述:

不能连着俩个偷,要偷最多。

思路:

如果偷numi那么最大值就是numi+dpi-2,如果不偷就是dpi-1

dpn代表偷到第n个位置的最大值

代码:

java 复制代码
class Solution {
    public int rob(int[] nums) {
        int n=nums.length;
        if(n==1){
            return nums[0];
        }
        int[] dp=new int[n];
        dp[0]=nums[0];
        dp[1]=Math.max(nums[0],nums[1]);

        for(int i=2;i<n;i++){
            dp[i]=Math.max(nums[i]+dp[i-2],dp[i-1]);
        }

        return dp[n-1];
    }
}

四.完全平方数

问题概述:

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

思路:

最坏的情况是都由1组成。x为最小数量。

n=1,x=1 n=2,x=2 这是固定的,

当n=3时,1*1<3 2*2>4 所以dp3=dp2+1

当n=4时,1*1<4 2*2=4 所以dp4=dp3+1 or dp0+1

。。。

当n=13时,1*1<13 2*2=4<13 3*3<13 4*4>13 所以dp13=dp12+1 or dp9+1 or dp4+1

代码:

java 复制代码
class Solution {
    public int numSquares(int n) {
        int[] dp=new int[n+1];

        for(int i=1;i<=n;i++){
            dp[i]=i;
        }

        for(int i=1;i<=n;i++){
            for(int j=1;j*j<=i;j++){
                dp[i]=Math.min(dp[i],dp[i-j*j]+1);
            }
        }
        
        return dp[n];
    }

}

五.零钱兑换

问题概述:

思路:

类似爬楼梯的思路,amount为目标台阶,每一步只能走coins数组中的台阶数,dpi表示到达第i级台阶所需的最小步数,那么自然可以想到dpi = min( dp i-coins\[j ] )+1。

初值设为amount+1,便于判断最后结果能不能凑成,是否为-1。如果像前面完全平方数设为i,比如dp5=5,如果数组为1,5则更新为1,如果为1则还是5,但是如果是3,那初值还是5就没法判断结果是否为-1。

代码:

java 复制代码
class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp=new int[amount+1];

        Arrays.fill(dp,amount+1);
        dp[0]=0;

        for(int i=1;i<=amount;i++){
            for(int coin : coins){
                if(i>=coin){
                    dp[i]=Math.min(dp[i],dp[i-coin]+1);
                }
            }
        }
        return dp[amount] > amount ? -1:dp[amount];
    }
}
相关推荐
Purple Coder17 分钟前
南京-我来啦
算法
w_zero_one23 分钟前
动态规划(三)
java·算法·动态规划
Logic10135 分钟前
C语言/数据结构贡献法题解:数组权值——所有连续子数组中不同数字个数之和(O(n)解法)
c语言·数据结构·算法·数组·时间复杂度·贡献法·哈希记录
DongQiShanRen35 分钟前
六根硬件映射(中):双站校验、生克闭环与驱动接口
数据库·人工智能·算法·rust·哈希算法·集成学习
mmmmath_31 小时前
LeetCode.637.二叉树的层平均值
算法·leetcode
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:并查集连通块与朋友圈问题解析
c++·python·算法·bfs·信息学竞赛
Tisfy1 小时前
LeetCode 2913.子数组不同元素数目的平方和 I:第一题先常数很大的O(n^2)
算法·leetcode·题解·模拟·暴力
罗湖老棍子1 小时前
[USACO05NOV] Asteroids G(洛谷-P7368)
算法·图论·二分图匹配·最大匹配·最小顶点覆盖
AI技术新视界1 小时前
Harness^2:递归自进化智能体Harnessing框架
人工智能·深度学习·算法·harness·rsi
这个DBA有点耶1 小时前
MySQL B-tree索引并发控制优化:写密集场景的锁瓶颈与内核级解法
java·数据库·程序人生·算法·database·dba