圆环回原点问题-字节跳动高频题

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了圆环回原点问题-字节跳动高频题相关的知识,希望对你有一定的参考价值。

一、题目描述

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

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

二、解题

动态规划

这题类似于爬楼梯,使用动态规划:走n步到0的方案数=走n-1步到1的方案数+走n-1步到9的方案数。

dp[i][j]表示从0点出发走i步到j点的方案数。
状态转移方程:

  • 走i步走到j的有n中方法 等于 走i-1步到 j-1 + 走 i-1步到j+1,因为有回环,所以需要走到j-1可能为负数
  • dp[i][j] = dp[i-1][(j-1+length)%length] + dp[i-1][(j+1+length)%length];
class Solution 
    public int backToOrigin(int k) 
        int[][] dp = new int[k + 1][10];
        dp[0][0] = 1;
        for (int i = 1; i <= k ; i++) 
            for (int j = 0; j < 10; j++) 
                dp[i][j] = dp[i - 1][(j - 1 + 10) % 10] + dp[i - 1][(j + 1) % 10];
            
        
        return dp[k][0];
    

延伸

class Solution 
    public int backToOrigin(int n, int k) 
        if (n == 0) 
            return 1;
        
        if (n == 2) 
            if (k % 2 == 0) 
                return k;
             else 
                return 0;
            
        
        int[][] dp = new int[k + 1][n];
        dp[0][0] = 1;
        for (int i = 1; i < k + 1; i++) 
            for (int j = 0; j < n; j++) 
                dp[i][j] = dp[i - 1][(j - 1 + n) % n] + dp[i - 1][(j + 1) % n];
            
        
        return dp[k][0];
    

以上是关于圆环回原点问题-字节跳动高频题的主要内容,如果未能解决你的问题,请参考以下文章

56. 合并区间-字节跳动高频题

字节跳动一道力扣没有的高频面试题题——排序奇升偶降链表

1. 两数之和-字节跳动高频题

33. 搜索旋转排序数组-字节跳动高频题

32. 最长有效括号(困难)-字节跳动高频题

字节跳动+百度+阿里巴巴高频面试题之链表专题