给定一个正整数int n,从0开始加到n,每次可增加1、2或3,直到其大于等于n,请返回一个数,代表加到n的方案的个数。保证n小于等于100000,并为了防止溢出,请将结果Mod 1000000007。
测试样例1:
1
返回:1
测试样例2:
3
返回:4
测试样例3:
4
返回:7
public class GoUpstairs { public int countWays(int n) { // write code here if (n == 1) { return 1; } if (n == 2) { return 2; } if (n == 3) { return 4; } // 数组下标n-1表示n阶台阶的走法 int count = 0; int n1 = 1; int n2 = 2; int n3 = 4; if (n > 3) { for (int i = 4; i <= n; i++) { count = ((n1 + n2)%1000000007 + n3)%1000000007; n1 = n2; n2 = n3; n3 = count; } } return count; } }
import java.util.*; public class GoUpstairs { public int countWays(int n) { // write code here if (n < 0) { return 0; } else if (n == 0) { return 1; } int f0 = 0, f1 = 0, f2 = 1, f3 = 0; for (int i = 1; i <= n; i++) { f3 = ((f1 + f2) % 1000000007 + f0) % 1000000007; f0 = f1; f1 = f2; f2 = f3; } return f3; } }
import java.util.*; public class GoUpstairs { public int countWays(int n) { int t1=0,t2=0,t3=1; int cur=0; while(n-->0){ cur=((t1+t2)%1000000007+t3)%1000000007; t1=t2%1000000007; t2=t3%1000000007; t3=cur%1000000007; } return cur; } }
参考某神的指导: "n阶对应的上法=(n-1)阶,(n-2)阶,(n-3)阶的走法总数."
则: f(n) = f(n-1)+f(n-2)+f(n-3);
double[] r = new double[n]; if (n >= 1) { r[0] = 1; } if (n >= 2) { r[1] = 2; } if (n >= 3) { r[2] = 4; } for (int i = 3; i < n; i++) { r[i] = (r[i - 1] + r[i - 2] + r[i - 3]) % 1000000007; } return (int) r[n - 1] % 1000000007;
public static int countWays(int n) { int[] d = new int[n]; d[0] = 1; if(n<3) return n; else if(n==3) return 4; else{ d[0] = 1; d[1] = 2; d[2] = 4; } for(int i=3;i<d.length;i++){ for(int j=0;j<3;j++){ d[i] = (d[i-3]+(d[i-2]+d[i-1])%1000000007)%1000000007; } } return d[n-1]; }