【每日算法Day 68】脑筋急转弯:只要一行代码,但你会证吗?

简介: 【每日算法Day 68】脑筋急转弯:只要一行代码,但你会证吗?

题目链接

LeetCode 1227. 飞机座位分配概率[1]

题目描述

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

剩下的乘客将会:

  • 如果他们自己的座位还空着,就坐到自己的座位上。
  • 当他们自己的座位被占用时,随机选择其他座位。

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

示例1

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

示例2

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

题解

这题呢代码相当之简单,但是我看了看题解区能真正理解的也不是很多,很多都是揣着糊涂装明白,稀里糊涂就当证过了。

首先题目并没有说第一个乘客座位号就是  啊?也没说最后一个乘客座位号就是  啊?所以大家的假设是怎么来的?这一点没有说清。其实很简单,不管每个乘客编号是多少,我们不用管,我们只要看他入场的次序就行了,所以我们就按照入场次序给他们重新编个号,这样的话就是按照  到  的编号入场了(也就是这里的编号代表的是入场的次序,而不是实际的座位号)。

然后就是  号进场了,可以分为下面几种情况:

  • 他有  的概率选择坐在  号座位上。这样  到  号位置都不会被占,那么  号坐在自己座位的概率就是  。
  • 他有  的概率选择坐在  号座位上。这样  到  号位置都不会被占,而  号只能坐在  号座位上,那么概率就是  。
  • 他有  的概率选择坐在  号座位上,其中 。这样  到  号位置都不会被占,他们都坐在自己的的位置上。而  号乘客就犯难了,他的座位被  号占了,他不知道坐哪了。这时候,如果他选择坐  号座位,那么  到  号乘客还是坐在自己位置,相安无事。而如果他选择坐在  到  号中的某个位置,那么必然又会产生新的冲突,这样就不好求解了啊!

对于第三种情况,我们可以换个角度看问题。现在面临的问题是, 号选择坐在哪?这时候还没入场的有  到  号乘客,而座位还剩  和  到  号。那既然  号乘客坐在  号座位的话,后面的人都能坐回原位,那我们就把  号座位当作是  号乘客原本的座位就行了嘛,反正我最后又不要求  号乘客坐回原位的概率,你坐哪都没事,只要别影响到其他人就行了。那么问题的规模就被缩小到了  ,我们递归求解就行了。

令  表示  个人的情况下,最后一个人坐回原位的概率,按照上面的分析,我们可以列出递推式:

这个递推式想必大家高中就会求了,令 再写出一项:

然后两式相减得到:

即:

那么我们就可以得到最终的答案了,对任意的  都有  。

还有一个特例就是  ,这样这题就证好了。

这题最关键的一步就是  号坐在了  号座位后, 号何去何从?如果你能换个角度,把  号座位给  号(因为给他之后,对后面的乘客座位没有任何影响,那么就能把  号座位看成就是  号乘客的),那么问题就能递归下去了。题解区许多人这一步为什么能递归下去?根本没有讲清楚。

代码

c++

class Solution {
public:
    double nthPersonGetsNthSeat(int n) {
        return n==1 ? 1 : .5;
    }
};

python

class Solution:
    def nthPersonGetsNthSeat(self, n: int) -> float:
        return 1 if n==1 else .5
相关文章
|
18天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
29天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
37 3
|
28天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
2月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
2月前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
18 0
|
2月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
25 0
|
3月前
|
机器学习/深度学习 存储 算法
经典算法代码
这段代码展示了多个经典算法,包括:穷举法解决“百钱买百鸡”问题;递推法计算“猴子吃桃”问题;迭代法求解斐波那契数列及折纸高度超越珠峰的问题。同时,还提供了希尔排序算法实现及披萨票务订购系统和汉诺塔问题的链表存储解决方案。每部分通过具体案例解释了算法的应用场景与实现方法。
31 3
|
4月前
|
人工智能 算法 数据可视化
DBSCAN密度聚类算法(理论+图解+python代码)
DBSCAN密度聚类算法(理论+图解+python代码)
|
4月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
46 0