🌸题目
🍁有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。
剩下的乘客将会:
如果他们自己的座位还空着,就坐到自己的座位上,
当他们自己的座位被占用时,随机选择其他座位
第 n 位乘客坐在自己的座位上的概率是多少?
示例 1:
输入:n = 1
输出:1.00000
解释:第一个人只会坐在自己的位置上。
示例 2:
输入: n = 2
输出: 0.50000
解释:在第一个人选好座位坐下后,第二个人坐在自己的座位上的概率是 0.5。
提示:
- 1 <= n <= 10^5
🌸解法:分类讨论
这道题代码很简单,但是就看你的脑袋想不想得到了,数学推理也挺难懂得,在这里大致说一下我的理解吧
- 第一,题目并没有按照座位号1-n的顺序进行乘客登录飞机,也就是说第一个乘客的座位号并不是1,但是有一点巧妙的点就在于这个题并不管乘客的座位号是如何编排的,因为座位号也同样是1-n,所以我们可以以乘客的登录飞机的顺序为乘客重新进行编号,即第一个乘客所对应的座位号(编号代表的是入场的次序,而不是实际的座位号)。
- 第二,按照所有的情况进行分类讨论
- 当n 等于1,毫无疑问,第n个乘客就是他自己,坐回他自己座位的概率为1.0
- 当n 不等于1,第一个乘客进入飞机后,可以分为以下几种情况。
-
他有1/n的概率去选择到原本属于他自己的座位,也就是说他选择对了,则后面的所有人位置都是对的,所以第n个人的概率为1
-
他有1/n的概率选择到第n个人座位,即第n个人无论如何也选择不了自己的座位,概率为0
-
如果第一个人选择到了第i个人的座位,那么第二个人到第i- 1个人的位置都是对的,轮到第i个人时就会感觉到迷茫。因为自己的位置被占据了,如果第i个人选择第一个人的座位,那么后面的人位置都是完全正确的,如果他选择到了第i + 1到第n个座位,那么后面的人也会遇到同样迷茫的问题,那么,怎么做呢?
-
其实,当轮到第i个人的时候,i感觉到了迷茫,就像一开始第一个人一样不知道自己应该坐哪儿,所以这个时候我们可以将i和1身份互换一下,令第一个位置就是i本身的座位,这样就会有i选择第一个座位,后面的人座位肯定是对的,如果i不选择1号,同样是会令下一个i感到迷茫,这样就可以产生递归了,并且将问题的规模缩减到了n - i + 1(即还剩下多少个座位没有没有被选或者还剩下多少个人没有选,n - i代表i后面的人,再加上迷茫的i就是n - i + 1)
-
我们令f(n)为第n个人坐到自己原本座位的概率,按照递推规律可有
-
f ( n ) = 1 n ( 1 + ∑ i = 2 n − 1 f ( n − i + 1 ) ) f(n) = \frac{1}{n}\left(1 + \sum_{i=2}^{n-1}{f(n-i+1)}\right) f(n)=n1(1+∑i=2n−1f(n−i+1))
-
这个递推式想必大家高中就会求了,令 n = n-1再写出一项:
-
f ( n − 1 ) = 1 n − 1 ( 1 + ∑ i = 2 n − 2 f ( n − i ) ) f(n-1) = \frac{1}{n-1}\left(1 + \sum_{i=2}^{n-2}{f(n-i)}\right) f(n−1)=n−11(1+∑i=2n−2f(n−i))
-
然后两式相减得到: n f ( n ) − ( n − 1 ) f ( n − 1 ) = f ( n − 1 ) nf(n) - (n-1)f(n-1) = f(n-1) nf(n)−(n−1)f(n−1)=f(n−1)
即: f ( n ) = f ( n − 1 ) = ⋯ = f ( 2 ) f(n) = f(n-1) = \cdots = f(2) f(n)=f(n−1)=⋯=f(2)
那么我们就可以得到最终的答案了,对任意的 n ≥ 2 n ≥ 2 n\ge2n≥2 n≥2n≥2都有
f(n) = f(2) = 0.5
-
-
另一种理解:可以把0到n-1看成一个整体,那对于n来说,无非就两种情况,前0到n-1号是否会把n的位置占据,概率就是0.5;只有一个人的情况概率为1(一定坐在自己的位置上)。
-
public double nthPersonGetsNthSeat(int n) {
return n == 1 ? 1.0 : 0.5;
}