1. 鸽巢原理
鸽巢原理又名抽屉原理、鞋盒原理,是一种简单的组合数学思想,在编程OJ、ACM,中广泛应用,往往能够达到优越的空间复杂度、时间复杂度。多用于解决存在性问题。
2. 定理证明
定理: 如果把n+1
个物体放入n
个盒子,至少有一个盒子包含两个或更多的物体。
证明: 反证法 n
个盒子每个盒子至多一个物品,总数至多为n
,与有n+1
个物体矛盾。
有等价定理:
定理2: 把m
个元素放进n
个集合内,至少有一个集合含有k
个元素,其中 :
-
k=m/n (n整除m)
-
k=[m/n]+1 (n不整除m)
定理3: 把无穷多个元素放进有限个集合,必然至少有一个集合里有无穷多个元素。
3. 相关例题
3.1 OJ例题
OJ 的简单应用见博主的:[剑指-Offer] 3. 数组中重复的数字(哈希、抽屉原理、代码优化、多方法)
LeetCode 41. 缺失的第一个正数
LeetCode 442. 数组中重复的数据
LeetCode 448. 找到所有数组中消失的数字
《剑指-Offer》面试题3:数组中重复的数字
其它相关 OJ,也很多百度一下啥都有了~
3.1 组合数学相关例题
在此推荐这篇博文:guoyangfan_:鸽巢原理详解