难点:
1、容易习惯性的使用递归解法,但递归的时间复杂度为O(2^n),超出时间限制。
2、加一次,就取余一次,避免溢出
3、采用非递归很容易想到用数组存储,空间复杂度为O(n)。 但更优化的解法是:定义两个变量交替互换,使空间复杂度也降低到O(1)
下面我给出两种代码,供大家参考。
欠佳的代码 (时间:O(n),空间O(n))
#include<iostream>
#define Max 1000005
using namespace std;
int a[Max]; //注意要定义全局变量,因为main函数中的数组最大容量为50W+ ,会溢出
int main() {
int n;
cin >> n;
a[0] = 1; a[1] = 1;
for(int i = 2; i < n; i++) {
a[i] = ((a[i-1]+a[i-2])%10007);
}
cout << a[n-1];
return 0;
}
最优解(时间:O(n), 空间:O(1))
#include<iostream>
using namespace std;
int main() {
int n; cin >> n;
int n1 = 1, n2 = 1;
for(int i = 2; i < n; i++) { int t = n2; n2 = ((n1+n2)%10007); n1 = t; }
cout << n2;
return 0;
}