斐波那契数列

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

1
2
3
F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
给定 N,计算 F(N)。

示例 1:

1
2
3
输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1.

示例 2:

1
2
3
输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2.

示例 3:

1
2
3
输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3.

提示:

1
0 ≤ N ≤ 30

方法一

1
2
3
4
5
6
// 通过递归的方式计算 - 有性能问题
// 时间复杂度: O(2^n)
func fib(_ n: Int) -> Int {
if n <= 1 { return n }
return fib1(n - 1) + fib1(n - 2)
}

方法二

1
2
3
4
5
6
7
8
9
10
11
12
// 时间复杂度: O(n)
func fib(_ n: Int) -> Int {
if n < 1 { return 0 }
var left = 1
var right = 0
for _ in 1..<n {
let sum = (left + right) % Int(1e9+7)
right = left
left = sum
}
return left
}
1
2
3
4
5
6
7
8
9
10
11
// 时间复杂度: O(n)
func fib(_ n: Int) -> Int {
if n < 1 { return 0 }
if n <= 2 { return 1 }
var array: [Int] = Array(repeating: 0, count: n+1)
array[1] = 1
for i in 2...n {
array[i] = (array[i-1] + array[i-2]) % Int(1e9 + 7)
}
return array[n]
}

Swift中如果数值越界,会崩溃。建议采用大值数作为容器。