有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。
剩下的乘客将会:
如果他们自己的座位还空着,就坐到自己的座位上,
当他们自己的座位被占用时,随机选择其他座位
第 n 位乘客坐在自己的座位上的概率是多少?
示例 1:
输入:n = 1
输出:1.00000
解释:第一个人只会坐在自己的位置上。
示例 2:
输入: n = 2
输出: 0.50000
解释:在第一个人选好座位坐下后,第二个人坐在自己的座位上的概率是 0.5。
假设1号票丢了, 那么他有三种座位情况:
- 1号有1/n的概率坐到1号座位,那么n号乘客坐到自己位置的概率为1;
- 1号有1/n的概率坐到n号座位,那么n号乘客坐到自己位置的概率为n;
- 1号n-2/n的概率坐到[2, n-1]座位,假设坐到了k号乘客的位置。
下面,k乘客就有对应三种座位情况:
- k乘客坐到1号座位
- k乘客坐到n号座位
- k乘客坐到[2~k-1] [k+1,n-1]。
如此,其实和n-1个座位[2, n]类似,所以可以递归。
// 递归
double nthPersonGetsNthSeat(int n){
if(n==1)
return 1;
return 1.0/n + (double)(n-2)/n* nthPersonGetsNthSeat(n-1);
}
// 自底向上
double nthPersonGetsNthSeat(int n){
double[] f = new double[n+1];
f[1] = 1;
for(int i=2;i<=n;i++){
f[i] = 1.0/i + (i-2)/i*f[i-1];
}
return f[n];
}
网友评论