题目描述
众所周知,牛牛不喜欢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]数组,使用额外的内存地址空间,因此空间复杂度为