原题如下:
https://leetcode-cn.com/problems/airplane-seat-assignment-probability/
题解:
n比较小时
可以看出,如果飞机上只有1个座位,那么这个丢了机票的人就只能坐在自己的位置上,不会坐错,此时爱侣就是1;
如果飞机上有两个座位,那么,第一位乘客有一半的概率坐在自己的位置上,那么第二位乘客就有一半的概率坐在自己的位置上,概率此时就是1/2;
当有3个位置的时候,首先第一个人坐到自己位置的概率是1/3,在这种前提下,别人都能坐在自己位置,那么我们再看第一个人没有坐在自己位置的时候,假设他坐在了第三个人的位置,那么就是无论如何,第三个人也不会坐在自己的位置;另外就是假如第一个人坐在了第二个人的位置,那么第二个人可能坐在了第一个人的位置此时的概率就是1/3*1/2=1/6,合起来就是1/3+1/6=1/2;
n是某个大于1的数
好了,现在我们来讨论一般性的推导,假如已经正确求出了n个座位的时候的概率P(n),如何求P(n+1)。
如果第n+1号乘客有可能坐在自己的座位上,那么在他上飞机的时候,自己的座位不能够被占,这里分两种情况:第一种是第一位(丢了机票的那个)上飞机的时候,在碰巧坐在了自己的位置,这个概率是1/(n+1);第二种是第一位乘客坐在了不是第n位乘客的位置,假如说是第k位乘客的位置,那么我们就可以想象着“把那个第一个乘客和他所占着的第k个位置剔除出去”,剩下的位置有第一个乘客本来应该坐的位置,和其他(n-1)个位置,以及2~(n+1)这n名乘客。我们这时就可以人为,那个被占了位置的k号乘客也是丢了机票的,只不过此时他自己“本来的位置”就是那个原来的1号乘客的位置,也就是在此时,剔除了一个座位和一个乘客后,在n个乘客和n个座位里面,最后一名乘客做到自己的位置的概率是P(n)。
那么根据以上的推导,有P(n+1)=1/(n+1)+((n-1)/(n+1))*P(n),并发现,当n>1的时候,P(n)=0.5恒成立。
本思路java代码示例
/*
*作者@v7fgg
*执行用时 :43 ms, 在所有 Java 提交中击败了5.03%的用户
*内存消耗 :45.9 MB, 在所有 Java 提交中击败了25.00%的用户
*2020年6月4日 14:41
*/
class Solution {
public double nthPersonGetsNthSeat(int n) {
if(n==1){
return 1;
}
return 1.0/n+(double)(n-2)/n*nthPersonGetsNthSeat(n-1);
}
}
那么进一步根据以上的推导,有P(n+1)=1/(n+1)+((n-1)/(n+1))*P(n),并发现,当n>1的时候,P(n)=0.5恒成立。
/*
*作者@v7fgg
*执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
*内存消耗 :36.4 MB, 在所有 Java 提交中击败了25.00%的用户
*2020年6月4日 11:36
*/
class Solution {
public double nthPersonGetsNthSeat(int n) {
return n<2?1:0.5;
}
}