DAILY DOCDAILY DOC
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
  • Array

    • 数组
    • 二分查找
    • moveZeros
  • Dynamic-programming

    • 动态规划
  • 刷题指南
  • String

    • 字符串
  • bitwise-operator

    • 位运算符
  • heap
  • history

    • [1014] 最佳观光组合
    • [1022] 从根到叶的二进制数之和
    • [104] 二叉树的最大深度
    • [11] 盛最多水的容器
    • [110] 平衡二叉树
    • [1227] 飞机座位分配概率
    • [129] 求根节点到叶节点数字之和
    • [1306] 跳跃游戏 III
    • [148] 排序链表
    • 155.最小栈
    • [165] 比较版本号
    • 1763. 最长的美好子字符串
    • [1870] 准时到达的列车最小时速
    • [199] 二叉树的右视图
    • [21] 合并两个有序链表
    • 215.数组中的第 k 个最大元素
    • [2306] 公司命名
    • [234] 回文链表
    • [2516] 每种字符至少取 K 个
    • [316] 去除重复字母
    • [3171] 找到按位或最接近 K 的子数组
    • [322] 零钱兑换
    • [41] 缺失的第一个正数
    • [44] 通配符匹配
    • [494] 目标和
    • [509] 斐波那契数
    • [518] 零钱兑换 II
    • [62] 不同路径
    • [676] 实现一个魔法字典
    • 70 爬楼梯
    • [718] 最长重复子数组
    • [78] 子集
    • [82] 删除排序链表中的重复元素 II
    • [871] 最低加油次数
    • [88] 合并两个有序数组
    • [887] 鸡蛋掉落
    • 958.二叉树的完全性检验
    • [98] 验证二叉搜索树
    • [983] 最低票价
    • leetcode practice
    • 约瑟夫问题
    • 移除重复节点
  • linked-list

    • 706. 设计哈希映射
    • 链表
  • stack

    • stack
  • tree

    • Tree Traversal
    • 二叉树的最近公共祖先
    • 二叉树
    • 题目
  • leetCode 刷题
  • 回溯
  • 排序算法

[1227] 飞机座位分配概率

递归

details

思路:

我们使用递归来计算第 n 位乘客坐在自己座位上的概率。

  • 如果 n = 1,概率为 1.0,因为只有一个人,必定坐在自己的座位上。
  • 如果 n > 1,则第一个乘客有 n 种选择座位的方式:
    • 若第一个乘客选择了自己的座位(概率为 1/n),则剩余的 n-1 位乘客按顺序坐下,此时最后一位乘客坐到自己座位的概率等于 1.0。
    • 若第一个乘客选择了第 k 位乘客的座位(概率为 1/n),那么问题变成 n-1 位乘客的问题(因为此时第 k 位乘客没有自己的座位,需要随机选择一个空座位)。因此,此时第 n 位乘客坐到自己座位上的概率等于 f(n-1)。

递推关系式:

  • 当 n = 1 时,f(1) = 1.0。
  • 当 n > 1 时,f(n) = (1/n) * 1.0 + (n-2)/n * f(n-1)。

递归代码实现(JavaScript):

var nthPersonGetsNthSeat = function (n) {
    // 递归基:n=1 时,直接返回 1
    if (n === 1) return 1.0;
    return 1 / n + ((n - 2) / n) * nthPersonGetsNthSeat(n - 1);
};

数学归纳

details

归纳推导:

  • n = 1 时,乘客必然坐在自己的座位上,概率为 1。

  • n = 2 时:

    • 第一个乘客有 50% 的概率选择 1 号座位或 2 号座位。
    • 如果他选择了 1 号座位,第二个乘客可以直接坐到自己的座位上,概率是 1。
    • 如果他选择了 2 号座位(即第二个乘客的座位),第二个乘客只能随机选择第一个乘客的座位,概率是 0。
    • 因此,最终的概率是 0.5。
  • n = 3 时:

    • 第一个乘客有三种可能:
      • 他选择自己的座位,剩下两位乘客按顺序入座,最后一位乘客坐到自己的座位上,概率是 1。
      • 他选择了最后一位乘客的座位,最后一位乘客不能坐到自己的座位上,概率是 0。
      • 他选择了第 2 位乘客的座位,这时第 2 和第 3 位乘客的情况与 n = 2 的情形相同,因此此时的概率是 0.5。

    由此可推得递推公式:

    • 当 n = 3 时,最终概率为 (1/n) * 1 + (1/n) * 0 + (1/n) * 0.5,即 1/3 + 1/6 = 0.5。

推广到一般情况:

  • 当 n 较大时,第一个乘客要么选择自己的座位,要么选择其他人的座位。
    • 如果第一个乘客选择了自己的座位,那么问题简化为 n-1 位乘客依次入座。
    • 如果第一个乘客选择了第 k 位乘客的座位(1 < k < n),则第 k 位乘客的入座问题与 n-1 的情形相同。

经过归纳和递推,可以得出结论:

  • 无论 n 的大小,第 n 位乘客坐在自己座位上的概率始终是 0.5。

代码实现(JavaScript):

var nthPersonGetsNthSeat = function (n) {
    return n === 1 ? 1.0 : 0.5;
};

复杂度分析:

  • 时间复杂度: O(1),因为该算法直接返回结果,无需复杂计算。
  • 空间复杂度: O(1),只需常量空间存储中间结果。

迭代实现

details
var nthPersonGetsNthSeat = function (n) {
    if (n === 1) return 1.0; // 基础情况

    // 从 n=2 开始,逐步计算到 n
    let result = 1.0; // 初始值 f(1) = 1.0
    for (let i = 2; i <= n; i++) {
        result = 1 / i + ((i - 2) / i) * result;
    }
    return result;
};
Last Updated:
Contributors: rosendo
Prev
[110] 平衡二叉树
Next
[129] 求根节点到叶节点数字之和