题目
解题思路
这是一个等比数列求和问题。关键点:
-
单个小球的路径:
- 下落: N N N 米
- 反弹: N / 2 N/2 N/2 米
- 下落: N / 2 N/2 N/2 米
- 反弹: N / 4 N/4 N/4 米
- 下落: N / 4 N/4 N/4 米
- …直到不再反弹
-
等比数列:
- 每次反弹高度是前一次的 1 / 2 1/2 1/2
- 每个高度都要算两次(上升和下降)
- 第一次下落只算一次
-
求和公式:
- 总距离 = N + 2 ∗ ( N / 2 + N / 4 + N / 8 + . . . ) N + 2 * (N/2 + N/4 + N/8 + ...) N+2∗(N/2+N/4+N/8+...)
- = N + N ∗ ( 1 + 1 / 2 + 1 / 4 + . . . ) N + N * (1 + 1/2 + 1/4 + ...) N+N∗(1+1/2+1/4+...)
- = 3 N 3N 3N
代码
class Balls {
public:
int calcDistance(int A, int B, int C, int D) {
return calcSingleBall(A) + calcSingleBall(B) +
calcSingleBall(C) + calcSingleBall(D);
}
private:
int calcSingleBall(int height) {
return height * 3;
}
};
import java.util.*;
public class Balls {
public int calcDistance(int A, int B, int C, int D) {
// write code here
return calcSingleBall(A) + calcSingleBall(B) +
calcSingleBall(C) + calcSingleBall(D);
}
private int calcSingleBall(int height) {
return height * 3;
}
}
# -*- coding:utf-8 -*-
class Balls:
def calcDistance(self, A, B, C, D):
return self.calcSingleBall(A) + self.calcSingleBall(B) + \
self.calcSingleBall(C) + self.calcSingleBall(D)
def calcSingleBall(self, height):
return height * 3
算法及复杂度
- 算法:数学公式
- 时间复杂度: O ( 1 ) \mathcal{O(1)} O(1),直接计算
- 空间复杂度: O ( 1 ) \mathcal{O(1)} O(1),只使用常数额外空间