leetcode
leetcode 1151 ~ 1200
飞机座位分配概率

飞机座位分配概率

难度:

标签:

题目描述

代码结果

运行时间: 24 ms, 内存: 16.1 MB


/*
 * 思路:
 * Java Stream不太适合这种简单的数学归纳问题,因此直接使用简单的if判断。
 */
import java.util.stream.IntStream;

public class Solution {
    public double nthPersonGetsNthSeat(int n) {
        return IntStream.of(n).mapToDouble(i -> i == 1 ? 1.0 : 0.5).findFirst().orElse(0.5);
    }
}

解释

方法:

这个问题可以通过递归思维来解决,但它的美在于可以简化为一个非常直观的数学问题。考虑两种情况: 1. 当只有一位乘客时,他只能坐在自己的座位上,所以概率是 1。 2. 当有多于一位乘客时,第一个乘客随机选择一个座位,这个选择将影响最后一位乘客能否坐在自己的座位上。第一个乘客可能坐在第一个座位上,可能坐在最后一个座位上,或者坐在中间的任何一个座位上。如果第一个乘客坐在最后一个座位上,那么最后一个乘客不能坐在自己的座位上。如果第一个乘客坐在第一个座位上,那么每个人都能坐在自己的座位上。如果第一个乘客坐在中间的某个座位上,这将触发一系列随机选择,但最终结果的概率总是趋向于 0.5,因为这变成了两个等可能的结果:最后一个乘客的座位被占用或未被占用。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
如何从数学角度详细解释当第一个乘客选择了中间任一座位时,最后一个乘客的座位被占用与未被占用的概率均为0.5的推导过程?
当第一个乘客选择中间的座位i(非第一个也非最后一个座位),接下来的乘客会面临两种情况:他们的座位被占用或者未被占用。如果被占用,他们可能会选择其他任何未被占用的座位。这样的选择持续进行直到最后一个乘客。在这一系列的随机选择中,最终只关注两个特殊的座位:第一个乘客选择的座位i和最后的座位n。由于每次座位的选择都是随机的,分析到最后一个乘客时,他的座位n要么是被第一个乘客占据的座位i,要么是其他未被选择的座位。因此,这里有两种可能:最后一个座位是空的(未被占用),或者已被之前的某个乘客占用。这两种情况是等可能的,因此最后一个乘客的座位被占用与未被占用的概率均为0.5。
🦆
题解中提到,如果第一个乘客坐在最后一个座位上,则最后一个乘客不能坐在自己的座位上。这里是否考虑了中间乘客的选择可能改变这一结果的情况?
题解中的情况考虑了中间乘客的选择,但当第一位乘客直接坐在最后一个座位上时,这个座位已经被占用,因此最后一位乘客无法坐在自己的座位上。中间的乘客虽有选择,但他们的选择不会改变最后一个座位已被占用这一事实。
🦆
在函数中只用到了一次条件判断,这种方法是否适用于所有的输入范围,即对于非常大的n(接近10^5)值,这种解释依然成立吗?
是的,这种方法适用于所有输入范围,包括非常大的n值。因为逻辑不依赖于具体的乘客数量,而是依赖于随机选择的性质和递归的结构。无论n的大小如何,最后一个乘客坐在自己座位的概率始终是0.5(除了n为1的特殊情况)。因此,这种方法对于大规模输入也是有效的。
🦆
题解指出,如果n为1,则返回1.0。这里是否可以详细解释一下为什么即使第一位乘客丢了票,他仍然会100%坐在自己的座位上?
当n为1时,即只有一位乘客,那么无论他是否记得自己的座位位置,由于飞机上只有一个座位可用,他只能坐在这个座位上。因此,无论是否丢失了票或忘记了座位号,最终他坐在自己座位上的概率仍然是100%。

相关问题