您的位置:首页 > 其它

LintCode_366 Fibonacci

2016-08-08 02:32 183 查看
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.

Have you met this question in a real interview? 

Yes

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: