牛客题解 | 抛小球
题目
解题思路
这是一个等比数列求和问题。关键点:
-
单个小球的路径:
- 下落:\(N\) 米
- 反弹:\(N/2\) 米
- 下落:\(N/2\) 米
- 反弹:\(N/4\) 米
- 下落:\(N/4\) 米
- ...直到不再反弹
-
等比数列:
- 每次反弹高度是前一次的 \(1/2\)
- 每个高度都要算两次(上升和下降)
- 第一次下落只算一次
-
求和公式:
- 总距离 = \(N + 2 * (N/2 + N/4 + N/8 + ...)\)
- = \(N + N * (1 + 1/2 + 1/4 + ...)\)
- = \(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
算法及复杂度
- 算法:数学公式
- 时间复杂度:\(\mathcal{O(1)}\),直接计算
- 空间复杂度:\(\mathcal{O(1)}\),只使用常数额外空间

浙公网安备 33010602011771号