LeetCode 题解工作台

飞机座位分配概率

有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。 剩下的乘客将会: 如果他们自己的座位还空着,就坐到自己的座位上, 当他们自己的座位被占用时,随机选择其他座位 第 n 位乘客坐在自己的座位上的概率是多少? 示例 1: 输入: n = 1 输出: 1.000…

category

4

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

中等 · 状态·转移·动态规划

bolt

答案摘要

用 表示当有 位乘客登机时,第 位乘客坐在自己的座位上的概率。从最简单的情况开始考虑: 当 时,只有 位乘客和 个座位,因此第 位乘客只能坐在第 个座位上,;

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

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

剩下的乘客将会:

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

  • 当他们自己的座位被占用时,随机选择其他座位

n 位乘客坐在自己的座位上的概率是多少?

 

示例 1:

输入:n = 1
输出:1.00000
解释:第一个人只会坐在自己的位置上。

示例 2:

输入: n = 2
输出: 0.50000
解释:在第一个人选好座位坐下后,第二个人坐在自己的座位上的概率是 0.5。

 

提示:

  • 1 <= n <= 10^5
lightbulb

解题思路

方法一:数学

f(n)f(n) 表示当有 nn 位乘客登机时,第 nn 位乘客坐在自己的座位上的概率。从最简单的情况开始考虑:

n=1n=1 时,只有 11 位乘客和 11 个座位,因此第 11 位乘客只能坐在第 11 个座位上,f(1)=1f(1)=1

n=2n=2 时,有 22 个座位,每个座位有 0.50.5 的概率被第 11 位乘客选中,当第 11 位乘客选中座位之后,第 22 位乘客只能选择剩下的座位,因此第 22 位乘客有 0.50.5 的概率坐在自己的座位上,f(2)=0.5f(2)=0.5

n>2n>2 时,如何计算 f(n)f(n) 的值?考虑第 11 位乘客选择的座位,有以下三种情况。

  • 11 位乘客有 1n\frac{1}{n} 的概率选择第 11 个座位,则所有乘客都可以坐在自己的座位上,此时第 nn 位乘客坐在自己的座位上的概率是 1.01.0

  • 11 位乘客有 1n\frac{1}{n} 的概率选择第 nn 个座位,则第 22 位乘客到第 n1n-1 位乘客都可以坐在自己的座位上,第 nn 位乘客只能坐在第 11 个座位上,此时第 nn 位乘客坐在自己的座位上的概率是 0.00.0

  • 11 位乘客有 n2n\frac{n-2}{n} 的概率选择其余的座位,每个座位被选中的概率是 1n\frac{1}{n}。 假设第 11 位乘客选择第 ii 个座位,其中 2in12 \le i \le n-1,则第 22 位乘客到第 i1i-1 位乘客都可以坐在自己的座位上,第 ii 位乘客到第 nn 位乘客的座位不确定,第 ii 位乘客会在剩下的 n(i1)=ni+1n-(i-1)=n-i+1 个座位中随机选择(包括第 11 个座位和第 i+1i+1 个座位到第 nn 个座位)。由于此时剩下的乘客数和座位数都是 ni+1n-i+1,有 11 位乘客会随机选择座位,因此问题规模从 nn 减小至 ni+1n-i+1

结合上述三种情况,可以得到 f(n)f(n) 的递推式:

f(n)=1n×1.0+1n×0.0+1n×i=2n1f(ni+1)=1n(1.0+i=2n1f(ni+1))\begin{aligned} f(n) &= \frac{1}{n} \times 1.0 + \frac{1}{n} \times 0.0 + \frac{1}{n} \times \sum_{i=2}^{n-1} f(n-i+1) \\ &= \frac{1}{n}(1.0+\sum_{i=2}^{n-1} f(n-i+1)) \end{aligned}

上述递推式中,ii 的取值个数有 n2n-2 个,由于 ii 的取值个数必须是非负整数,因此只有当 n20n-2 \ge 0n2n \ge 2 时,上述递推式才成立。

如果直接利用上述递推式计算 f(n)f(n) 的值,则时间复杂度为 O(n2)O(n^2),无法通过全部测试用例,因此需要优化。

将上述递推式中的 nn 换成 n1n-1,可以得到递推式:

f(n1)=1n1(1.0+i=2n2f(ni))f(n-1) = \frac{1}{n-1}(1.0+\sum_{i=2}^{n-2} f(n-i))

上述递推式中,ii 的取值个数有 n3n-3 个,只有当 n30n-3 \ge 0n3n \ge 3 时,上述递推式才成立。

n3n \ge 3 时,上述两个递推式可以写成如下形式:

n×f(n)=1.0+i=2n1f(ni+1)(n1)×f(n1)=1.0+i=2n2f(ni)\begin{aligned} n \times f(n) &= 1.0+\sum_{i=2}^{n-1} f(n-i+1) \\ (n-1) \times f(n-1) &= 1.0+\sum_{i=2}^{n-2} f(n-i) \end{aligned}

将上述两式相减:

     n×f(n)(n1)×f(n1)=(1.0+i=2n1f(ni+1))(1.0+i=2n2f(ni))=i=2n1f(ni+1)i=2n2f(ni)=f(2)+f(3)+...+f(n1)(f(2)+f(3)+...+f(n2))=f(n1)\begin{aligned} &~~~~~ n \times f(n) - (n-1) \times f(n-1) \\ &= (1.0+\sum_{i=2}^{n-1} f(n-i+1)) - (1.0+\sum_{i=2}^{n-2} f(n-i)) \\ &= \sum_{i=2}^{n-1} f(n-i+1) - \sum_{i=2}^{n-2} f(n-i) \\ &= f(2)+f(3)+...+f(n-1) - (f(2)+f(3)+...+f(n-2)) \\ &= f(n-1) \end{aligned}

整理后得到简化的递推式:

n×f(n)=n×f(n1)f(n)=f(n1)\begin{aligned} n \times f(n) &= n \times f(n-1) \\ f(n) &= f(n-1) \end{aligned}

由于已知 f(1)=1f(1)=1f(2)=0.5f(2)=0.5,因此当 n3n \ge 3 时,根据 f(n)=f(n1)f(n) = f(n-1) 可知,对任意正整数 nn 都有 f(n)=0.5f(n)=0.5。又由于 f(2)=0.5f(2)=0.5,因此当 n2n \ge 2 时,对任意正整数 nn 都有 f(n)=0.5f(n)=0.5

由此可以得到 f(n)f(n) 的结果:

f(n)={1.0,n=10.5,n2f(n) = \begin{cases} 1.0, & n = 1 \\ 0.5, & n \ge 2 \end{cases}

时间复杂度 O(1)O(1),空间复杂度 O(1)O(1)

1
2
3
4
class Solution:
    def nthPersonGetsNthSeat(self, n: int) -> float:
        return 1 if n == 1 else 0.5
speed

复杂度分析

指标
时间complexity is O(n) for iterative or recursive computation but reduces to O(1) using the mathematical simplification. Space complexity is O(1) if storing only the current probability value, otherwise O(n) for full DP array.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Check if the candidate identifies the base cases f(1) and f(2) quickly.

  • question_mark

    Look for recognition of the state transition pattern in seat selection probabilities.

  • question_mark

    Evaluate if the candidate can simplify to the constant probability insight for n > 1.

warning

常见陷阱

外企场景
  • error

    Ignoring the first passenger's random choice effect on subsequent probabilities.

  • error

    Attempting full permutation simulation, which is unnecessary and inefficient.

  • error

    Failing to correctly implement the state transition formula f(n) = 1/n + (n-2)/n * f(n-1).

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Compute the probability if the first k passengers choose randomly instead of only the first passenger.

  • arrow_right_alt

    Determine the expected number of displaced passengers using similar DP state transitions.

  • arrow_right_alt

    Extend the problem to a plane with multiple seat classes affecting passenger choices.

help

常见问题

外企场景

飞机座位分配概率题解:状态·转移·动态规划 | LeetCode #1227 中等