【算法】字节高频题——圆环回原点问题

359 阅读1分钟

描述

首先引用一些考到本题的面经原文描述

  • 0-12共13个数构成一个环,从0出发,每次走1步,走n步回到0共有多少种走法(2020.09 字节跳动-广告-后端)[1]
  • 0-8组成一个圆环,从0出发,每次可以逆时针和顺时针走,走n步能回到0有多少种情况(2020.09 字节跳动-people-后端)[2]
  • 0~9的环,从0出发,N步后能否走回0。(2020.07 字节跳动-电商-后端)[3]
  • 圆环回原点问题 (2020.08 字节跳动-飞书-后端)[4]

圆环上有10个点,编号为0~9。从0点出发,每次可以逆时针和顺时针走一步,问走n步回到0点共有多少种走法。

输入: 2
输出: 2
解释:有2种方案。分别是0->1->00->9->0

题解

  • 圆环上有10个点,编号为0~9。从0点出发,每次可以逆时针和顺时针走一步,问走n步回到0点共有多少种走法
  • dp[i][j] 表示走i步 能走到j点的方案次数
  • 自己画个dp图就出来了,其实很简单
  • 递推公式:dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1] 因为j可能越界,因为是一个环
  • 递推公式:推公式:dp[i][j] = dp[i-1][(j+1)%10] + dp[i-1][(j-1+10)%10]
public int loopOrigin(int n){
    // 10 个 点0-9,
    int[][] dp = new int[n][10];
    // 初始化第0行(走一步)
    dp[0][1] = 1;
    dp[0][9] = 1;
    for (int i = 1; i < n; i++){
        for(int j = 0; j < 10; j++){
            dp[i][j] = dp[i-1][(j+1)%10] + dp[i-1][(j-1+10)%10];
        }
    }
    return dp[n-1][0];
}