面试题08.01.三步问题|刷题打卡

167 阅读1分钟

一.问题描述

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

示例1.

输入:n = 3 
输出:4
说明: 有四种走法

示例2.

 输入:n = 5
 输出:13

提示:1.n范围在[1,1000000]之间

二.解题思路

从题目描述中看,小孩一次可以上1阶、2阶、3阶。如果现在楼梯只有一阶,那么只有1种,如果是2阶,有3种(直接上两阶或者上两次1阶),如果是3阶,有4种(直接上3阶,上一次1阶一次2阶,一次2阶一次1阶,上三次1阶),所以上i阶共有:

  • 从i-3阶走3阶
  • 从i-2阶走2阶
  • 从i-1阶走1阶

那么i阶就是i-3阶、i-2阶、i-1阶的阶数之和,那么就是dp[i]=dp[i-3]+dp[i-2]+dp[i-1];考虑到结构只收到三个数值的影响,就用三个数组代替n维数组

class Solution {    public int waysToStep(int n) {            int m=1000000007;        if(n==1)        return 1;        if(n==2)        return 2;        if(n==3)        return 4;        int sum=0;                        int first=1;             int second=2;             int three=4;              for(int i=4;i<=n;i++){            sum=((three+first)%m+second)%m;            first=second;            second=three;            three=sum;             }             return sum;    }}

三.总结

每一次的总结都是对自己的赞美。嗖嗖

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情