Find the Nth number in Fibonacci sequence.
A Fibonacci sequence is defined as follow:
- The first two numbers are 0 and 1.
- The i th number is the sum of i-1 th number and i-2 th number.
The first ten numbers in Fibonacci sequence is:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...
Notice
The Nth fibonacci number won't exceed the max value of signed 32-bit integer in the test cases.
Example
Given 1
, return 0
Given 2
, return 1
Given 10
, return 34
来个logn版
class Solution{
public:
/**
* @param n: an integer
* @return an integer f(n)
*/
int fibonacci(int n) {
// write your code here
if ( n <= 2)
return n - 1;
else {
vector<vector<int>> vec;
vector<int> v1 = {1,1};
vec.push_back(v1);
vector<int> v2 = {1,0};
vec.push_back(v2);
vector<vector<int>> res = matrix_exp(vec, n - 2);
int r = res[0][0];
return r;
}
}
vector<vector<int>> matrix_exp(vector<vector<int>>& vec, int n) {
if (n == 1) {
return vec;
}
vector<vector<int>> res;
if ( n % 2 == 0) {
vector<vector<int>> t = matrix_exp(vec, n/2);
res = multi_matrix(t,t);
} else {
vector<vector<int>> t = matrix_exp(vec, n/2);
vector<vector<int>> tt = multi_matrix(t,t);
res = multi_matrix(vec,tt);
}
return res;
}
vector<vector<int>> multi_matrix(vector<vector<int>>& m1, vector<vector<int>>& m2) {
vector<vector<int>> res = m1;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
res[i][j] = 0;
for (int k = 0; k < 2; k++) {
res[i][j]+=m1[i][k] *m2[k][j];
}
}
}
return res;
}
};