题目描述
众所周知,牛牛不喜欢6这个数字(因为牛牛和66发音相近)
所以他想知道,不超过n位十进制数中有多少个数字不含有连续的6(从1开始算的)
输入只包含一个正整数n(1<=n<20)
方法一:递归的思想
求解思路
对于本题目所要求解的答案,因为要求出不连续的6,因此我们自然想到第i位数字是否为6与i-1和i-2这两位是否为6有关,因此我们可以用递归的方法求出相应的答案。
解题代码
import java.util.*;
public class Solution {
long[] memory; // 辅助数组
public String calculate (int n)
{
memory=new long[n+1]; // 初始化辅助数组
dfs(n); // 递归
return String.valueOf(memory[n]);
}
private long dfs(int i)
{ // stop 1
if(i==0)
{
memory[i]=1;
return 1;
}
// stop 2
if(i==1)
{
memory[i]=10;
return 10;
}
if(memory[i]!=0)
return memory[i];
memory[i]=(dfs(i-2)+dfs(i-1))*9;
return (dfs(i-2)+dfs(i-1))*9; // 返回结果
}
}复杂度分析
时间复杂度:一层循环,因此时间复杂度为
空间复杂度:引入辅助数组,使用额外的内存地址空间,因此空间复杂度为
方法二:动态规划的思想求解
求解思路
基于方法一,我们知道对于第i位是否为6,与第i-1和i-2位数字有关,因此我们定义dp[i]表示第i位填入数字以后,有多少种结果使得不存在连续的6,其状态转移方程为:。同时我们定义初始化条件,当输入为0时,dp[0]=1.当输入为1时,dp[1]=10。根据上述的思路,我们即可用动态规划的思想对本题进行答案的求解。
解题代码
class Solution:
def calculate(self , n ):
# 定义mydp数组
mydp = [0] * (n+1)
# 初始化
mydp[0] = 1
mydp[1] = 10
# 循环计算
for i in range(2, n+1):
mydp[i] = (mydp[i-2] + mydp[i-1]) * 9 # 动态规划的思想
return str(mydp[n]) # 返回结果复杂度分析
时间复杂度:一层循环,因此时间复杂度为
空间复杂度:引入dp[n]数组,使用额外的内存地址空间,因此空间复杂度为

京公网安备 11010502036488号