【Java】LeetCode 1227. 飞机座位分配概率——数学好一行解决

有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。
剩下的乘客将会:
如果他们自己的座位还空着,就坐到自己的座位上,
当他们自己的座位被占用时,随机选择其他座位
第 n 位乘客坐在自己的座位上的概率是多少?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/airplane-seat-assignment-probability
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

乍一看应该想到:对于第一个人有三种可能:

①坐上自己的座位,那么之后每一个人都能坐到自己的座位上

②坐上2~n-1内的座位上(假设为x号),那么x之前的所有人都能坐上自己的座位,x号随机坐,此时转化为N=n-x+1的问题

③直接坐上n的位置,n没有位置坐

因此,我们可以从n=2开始计算,存储之前所有答案即可

要注意的是,虽然n=1时答案为1,但是存储的答案应该为0,因为除了n号外的人坐上座位都会使得n号坐不上n座位

对于n=2,显然概率为1/2

对于n=n呢? 概率应该为 (1/n)*1 (坐上自己位置)+(1/n)*P(n-1) (坐上2号位置,变成n-1人问题)+(1/n)*P(n-2) (坐上2号位置,变成n-2人问题) …+(1/n)*0 (坐上n号位置,直接gg)

即P(n)=(1/n)*1+(1/n)(P(n-1)+P(n-2)…+P(1))

有思路了就,写!

等等!

【Java】LeetCode 1227. 飞机座位分配概率——数学好一行解决_第1张图片

稍微算了两个,在P(1)=0,P(2)=1/2的情况下,P(3)P(4)也都等于1/2

【Java】LeetCode 1227. 飞机座位分配概率——数学好一行解决_第2张图片

是不是,除了P(1)都等于1/2呢?

用数学归纳法其实很好证明,

在2~n-1时P等于1/2 1时P等于0的前提下,带入以上通式可以得到P(n)就正好等于1/2!!!

而P(1)=0,P(2)=1/2

class Solution {
     
    public double nthPersonGetsNthSeat(int n) {
     
        if(n==1){
     
            return 1;
        }else{
     
            return 0.5;
        }
    }
}

说好的一行呢?

【Java】LeetCode 1227. 飞机座位分配概率——数学好一行解决_第3张图片

class Solution {
     
    public double nthPersonGetsNthSeat(int n) {
     
        return n==1?1:0.5;
    }
}

【Java】LeetCode 1227. 飞机座位分配概率——数学好一行解决_第4张图片
【Java】LeetCode 1227. 飞机座位分配概率——数学好一行解决_第5张图片

你可能感兴趣的:(有趣的面试题,算法,java)