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

Posted wenzhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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%

技术图片

 

 

  

以上是关于LeetCode No.1227 飞机座位分配概率的主要内容,如果未能解决你的问题,请参考以下文章

疯子坐飞机问题

火车票网上售票,座位顺序分配是如何进行的?

2018-2019 ACM-ICPC, China Multi-Provincial Collegiate D. Take Your Seat(数学概率)

[CSP-S模拟测试]:Seat(概率DP+数学)

LeetCode-765 情侣牵手/交换座位

想用vb做个排座位软件,实现了两个文本框的拖拽和位置互换,但50多个的用这个办法显然不行。望高手指点。