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:
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
Given
Given
来个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;
}
};
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;
}
};
相关文章推荐
- lintcode 容易题:Fibonacci 斐波纳契数列
- Lintcode--3(366)--斐波那契数列
- LintCode_366_斐波纳契数列
- LintCode 366. 斐波纳契数列
- LintCode_366_斐波纳契数列
- LintCode_366_斐波纳契数列
- 【LintCode 入门】366. 斐波纳契数列
- [LintCode]Fibonacci(Python)
- lintcode-366
- lintcode-easy-Fibonacci
- 【LintCode-366】斐波纳契数列 (Java实现)
- lintcode,报数
- lintcode,二叉树的中序遍历
- lintcode,将二叉查找树转换成双链表
- lintcode,单词切分
- LintCode 57-三数之和
- lintcode,删除排序链表中的重复数字 II
- Lintcode 9.Fizz Buzz 问题
- [LintCode] Merge Two Sorted Lists 混合插入有序链表
- LintCode 548 两数组的交 II