力扣一日一练(22)——飞机座位分配概率

280 阅读3分钟

题目:飞机座位分配概率

有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。

剩下的乘客将会:

如果他们自己的座位还空着,就坐到自己的座位上,

当他们自己的座位被占用时,随机选择其他座位
第 n 位乘客坐在自己的座位上的概率是多少?

 

示例

示例 1:

输入:n = 1
输出:1.00000
解释:第一个人只会坐在自己的位置上。


示例 2:

输入: n = 2
输出: 0.50000
解释:在第一个人选好座位坐下后,第二个人坐在自己的座位上的概率是 0.5。

提示:

1 <= n <= 10^5

 

使用JavaScript语言

/**
 * @param {number} n
 * @return {number}
 */
var nthPersonGetsNthSeat = function(n) {   
    if(n == 1){
        return parseFloat(n);
    }else{
        var p = 1;
        for(var i = 2;i <= n; i++){
            p = (1 + p*(i-2))/i
        }
        return parseFloat(p)
    }
    
};

 

分析

本题是使用了数学归纳法,这题我也是看大佬们的分析才看懂的。

大佬的分析:

对于第一个乘客来说 他有三种选择

坐在正确的(自己的位置), 那么后面的乘客都不会乱,所以第n个乘客可以坐到自己的位置, 1/n * 1.
坐在第n个乘客的位置,那么第n个乘客肯定无法坐到自己的位置, 1/n * 0.
坐在[1,n-1]之间的某个位置K.
对于第K个乘客而言,自己的位置K已经被乘客1给占了,而[2,K-1]的乘客先于K乘客 上飞机,能找到自己的位置并坐下,所以当K乘客上飞机时,留给他的选择是
第1个座位,以及[K+1,n]的座位。
此时K乘客同样有3个选择,

如果他坐在正确的座位,那么后面的乘客都不会乱,第n个乘客可以坐到自己的位置,
只不过此时对于K乘客而言,正确的座位就是座位1。
坐在第n个乘客的位置,那么第n个乘客肯定无法坐到自己的位置
坐在[K+1,n-1]之间的某个位置。
可以发现对于第一个乘客和第K个乘客,他们面临的选择是一样的,只不过问题的规模不一样。第K个乘客时,问题的规模只有n-K+1. (为何, 上面已经解释过了,对于第K个乘客而言,自己的位置K已经被乘客1给占了,而[2,K-1]的乘客先于K乘客 上飞机,能找到自己的位置并坐下)。

所以此题公式为
p[1] = 1.0;
p[2] = 0.5;

p[3] = 1/3 + p[2]/3 = 0.5;
p[4] = 1/4 + p[2]/4 + p[3]/4 = 0.5
进行简单的模拟:一共100个人
①当1(序号代表的是第几位乘客)占了1号的位子时(由于是随便选所以也可以选1),100号的乘客一定可以做到自己的位置上面,所以此时概率为1
②如果1坐到了2上面,那么2就会有两类选择:占据1或者3~100之间的任一个位置:
如果2占据了1,那么就可以看做1~2是没有问题的,100也可以坐到100上面
如果2占据了5,那么就可以看做1~4没有问题,继续分析的是(5~100)之间的问题,
相当于5号乘客没有自己的位子坐,只能坐前面一个或者6~100之间的一个位子,
但是5可以选前面的一个位置,说明该问题又可以等效于5在5~100里面选一个位子,
就是1~95里面的问题

如果任选一个k(3 <= k <= 100)那么就要继续分析剩余的子问题

其实这道题目到最后可以归为:

if(n == 1){
    return parseFloat(n);
}else{
     return parseFloat(0.5)
}