LeetCode No.1227 飞机座位分配概率

题目描述: 

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

  剩下的乘客将会:

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

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

输入当次飞机乘客总人数,输出最后一名乘客坐在正确的座位上的概率。

解题思路:

  (1)第一名乘客坐在自己的位置上的概率为1/n,第二名乘客坐在自己座位上概率也是1/n,此时,将第二名乘客作为第一名乘客,采取递归算法,算第n名乘客坐在自己座位上的概率。

      结果:栈溢出。

      分析原因:应该是输入的乘客数量过大,导致java栈中不能容纳。

思路改进:

  将应用问题抽象成数学问题。           

  第一位乘客落座后,如果坐在自己的座位上,那最后一名乘客就一定能正确落座,如果第一位乘客没有坐在自己的座位上,那假设其坐在乘客x的座位,本问题就转化为以乘客x开始,求乘客n最终坐在自己位置上的概率。

  不妨设当总人数为a是最后一名乘客坐在自己座位上的概率是f(a),那么总人数为n时,概率为f(n)。而问题经过转化,第一个乘客坐到了第x个乘客的座位,轮到乘客x随机坐了。那此时将乘客x视为新的乘客1,

  易知f(n) = f(n-x)。即最终概率与人数无关。

  这样,经过递归,当人数总数 = 1时,f(1) = 1;而当n = 2,3,4……,f(n) = f(2) = 1/2;

  就这样,问题结束。当输入的整数为1时,输出为1。而当输入的整数更多时,输出为0.5.

 代码:

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

最终结果:时间复杂度O(1),战胜100%

  

猜你喜欢

转载自www.cnblogs.com/wenzhao/p/12239906.html