有 n
位乘客即将登机,飞机正好有 n
个座位。第一位乘客的票丢了,他随便选了一个座位坐下。
剩下的乘客将会:
-
如果他们自己的座位还空着,就坐到自己的座位上,
- 当他们自己的座位被占用时,随机选择其他座位
第 n
位乘客坐在自己的座位上的概率是多少?
示例 1:
输入:n = 1 输出:1.00000 解释:第一个人只会坐在自己的位置上。
示例 2:
输入: n = 2 输出: 0.50000 解释:在第一个人选好座位坐下后,第二个人坐在自己的座位上的概率是 0.5。
提示:
1 <= n <= 10^5
方法一:数学
用
-
当
$n=1$ 时,只有$1$ 位乘客和$1$ 个座位,因此第$1$ 位乘客只能坐在第$1$ 个座位上,$f(1)=1$; -
当
$n=2$ 时,有$2$ 个座位,每个座位有$0.5$ 的概率被第$1$ 位乘客选中,当第$1$ 位乘客选中座位之后,第$2$ 位乘客只能选择剩下的座位,因此第$2$ 位乘客有$0.5$ 的概率坐在自己的座位上,$f(2)=0.5$。
当
-
第
$1$ 位乘客有$\frac{1}{n}$ 的概率选择第$1$ 个座位,则所有乘客都可以坐在自己的座位上,此时第$n$ 位乘客坐在自己的座位上的概率是$1.0$ 。 -
第
$1$ 位乘客有$\frac{1}{n}$ 的概率选择第$n$ 个座位,则第$2$ 位乘客到第$n-1$ 位乘客都可以坐在自己的座位上,第$n$ 位乘客只能坐在第$1$ 个座位上,此时第$n$ 位乘客坐在自己的座位上的概率是$0.0$ 。 -
第
$1$ 位乘客有$\frac{n-2}{n}$ 的概率选择其余的座位,每个座位被选中的概率是$\frac{1}{n}$ 。 假设第$1$ 位乘客选择第$i$ 个座位,其中$2 \le i \le n-1$ ,则第$2$ 位乘客到第$i-1$ 位乘客都可以坐在自己的座位上,第$i$ 位乘客到第$n$ 位乘客的座位不确定,第$i$ 位乘客会在剩下的$n-(i-1)=n-i+1$ 个座位中随机选择(包括第$1$ 个座位和第$i+1$ 个座位到第$n$ 个座位)。由于此时剩下的乘客数和座位数都是$n-i+1$ ,有$1$ 位乘客会随机选择座位,因此问题规模从$n$ 减小至$n-i+1$ 。
结合上述三种情况,可以得到
上述递推式中,$i$ 的取值个数有
如果直接利用上述递推式计算
将上述递推式中的
上述递推式中,$i$ 的取值个数有
当
将上述两式相减:
整理后得到简化的递推式:
由于已知
由此可以得到
class Solution:
def nthPersonGetsNthSeat(self, n: int) -> float:
return 1 if n == 1 else 0.5
class Solution {
public double nthPersonGetsNthSeat(int n) {
return n == 1 ? 1 : .5;
}
}
class Solution {
public:
double nthPersonGetsNthSeat(int n) {
return n == 1 ? 1 : .5;
}
};
func nthPersonGetsNthSeat(n int) float64 {
if n == 1 {
return 1
}
return .5
}