标签: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 抽象 style tco 栈溢出 double 分析 改进 假设
原文地址:https://www.cnblogs.com/wenzhao/p/12239906.html