题目描述
1 个细胞的生命周期是 3 小时,1 小时分裂一次。求 n 小时后,容器内有多少细胞?请你用已经学过的递归时间复杂度的分析方法,分析一下这个递归问题的时间复杂度。
题目分析
以剩余时间为 4 为例:初始情况,只有一个细胞,还未分裂。第一行中第2列到第4列的数字表示对应周期细胞的数量,剩余时间为3时,生命周期为3的有一个细胞,生命周期为2的有一个细胞。
剩余时间 | 1 | 2 | 3 | 存活细胞总数 | 死亡细胞总数 | 细胞总数 |
---|---|---|---|---|---|---|
4 | 1 | 1 | 0 | 1 | ||
3 | 1 | 1 | 2 | 0 | 2 | |
2 | 1 | 1 | 2 | 4 | 0 | 4 |
1 | 1 | 2 | 4 | 7 | 1 | 8 |
0 | 2 | 4 | 7 | 13 | 2 | 15 |
其实根据表格可以看出来,存活细胞总数 = 生命为(1,2,3)的细胞数量的总和
,答案只跟这三个变量有关,可以用一个数组来存储它们。
代码实现
func cell(n int) int {
// 初始情况, 只有一个生命为3的细胞
// 存放不同生命值的细胞数量,生命值-1 ==> 细胞数量
cells := [3]int{2: 1}
// 细胞总数,当前存活细胞总数
// totalNum, surviveNum := 1, 1
// 当前存活细胞总数
surviveNum := 1
for ; n > 0; n-- {
// 存活的细胞生命减1
for i := 1; i < 3; i++ {
cells[i-1] = cells[i]
}
// 存活的细胞都会分化出一个新的细胞
// totalNum += surviveNum
// 分化出的新细胞全为 生命为3
cells[2] = surviveNum
// 更新当前存活的细胞总数
surviveNum = cells[0] + cells[1] + surviveNum
}
return surviveNum
}
时间复杂度
表面上是循环嵌套,时间复杂度为 O(n^2)
,实际上内层循环次数并不随数据规模 n
的增大而增大,所以依旧是常数级的。其时间复杂度应该为 O(n)
。
网友评论