码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-01-29 12:32:26      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:leetcode   抽象   style   tco   栈溢出   double   分析   改进   假设   

题目描述: 

  有 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 飞机座位分配概率

标签:leetcode   抽象   style   tco   栈溢出   double   分析   改进   假设   

原文地址:https://www.cnblogs.com/wenzhao/p/12239906.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!