数据结构与算法——动态规划(2)——动态规划题目(1)——一维动态规划(1)

声明:以下练习题目均来自于https://leetcode-cn.com/

目录

0.一维动态规划

1.爬楼梯

1.1 问题描述

1.2 分析

1.3 列表

1.4 公式

1.5 代码实现

2.打家劫舍

2.1 问题描述

2.2 分析

2.3 列表

2.4 公式

2.5 代码实现

2.6 优化

3.打家劫舍||

3.1 问题描述

3.2 分析

3.3 列表

3.4 代码实现


0.一维动态规划

  • 动态规划都需要把之前的值存起来,即子问题的解存起来
  • 使用一维数组存储起来之前的值,即为一维动态规划

1.爬楼梯

1.1 问题描述

1.2 分析

  • 对于每层台阶i,前一步只可能有两种情况:
    • 在i-2层,爬2阶到i层
    • 在i-1层,爬1阶到i层

1.3 列表

台阶总数 1 2 3 4 5 6
方法数 1 2 3 5 8 13

 

 

 

1.4 公式

  • methodNum[i]  = methodNum[i-2] + methodNum[i-1];

1.5 代码实现

package dynamic.climbStairs;

public class ClimbStairs {

    /**
     * 爬楼梯
     * @param stairNum  楼梯阶数
     * @return  爬楼梯的方法数
     */
    public int climbStairs(int stairNum){
        //输入的n非法时,返回0
        if(stairNum <= 0)
            return 0;
        //只有1层台阶时,只有1种方法
        if(stairNum == 1)
            return 1;


        //初始化第1,2层台阶的方法数量(保证下面的递推公式中不会越界)
        int prev_2_methodNum = 1;    //当前台阶的前2个台阶
        int prev_1_methodNum = 2;    //当前台阶的前1个台阶


        //初始化当前台阶的方法数为第二层台阶的方法数
        int curr_methodNum = prev_1_methodNum;

        //从第3层台阶开始遍历,通过递推公式计算得到最终的方法数
        for (int i = 2; i < stairNum; i++) {
           curr_methodNum = prev_1_methodNum + prev_2_methodNum;

           //为下一次计算,迭代新的值
            prev_2_methodNum = prev_1_methodNum;
            prev_1_methodNum = curr_methodNum;
        }

        return curr_methodNum;
    }
}

已测试通过:

  • 效率分析:
    • 时间复杂度为:O(n)
    • 空间复杂度为:O(1)

2.打家劫舍

2.1 问题描述

2.2 分析

  • 对于每个房子
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值