1227. 飞机座位分配概率

有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。
剩下的乘客将会:
如果他们自己的座位还空着,就坐到自己的座位上,
当他们自己的座位被占用时,随机选择其他座位
第 n 位乘客坐在自己的座位上的概率是多少?

示例 1:

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

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

假设1号票丢了, 那么他有三种座位情况:

  1. 1号有1/n的概率坐到1号座位,那么n号乘客坐到自己位置的概率为1;
  2. 1号有1/n的概率坐到n号座位,那么n号乘客坐到自己位置的概率为n;
  3. 1号n-2/n的概率坐到[2, n-1]座位,假设坐到了k号乘客的位置。

下面,k乘客就有对应三种座位情况:

  1. k乘客坐到1号座位
  2. k乘客坐到n号座位
  3. 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];
}

你可能感兴趣的:(1227. 飞机座位分配概率)