演示物体向容器的投射分布,直观解释碰撞发生的必要界限
鸽巢原理 (Pigeonhole Principle) 是组合数学中最简单但也是最强大的定理之一。它常常用于证明某种必然性(如必存在两个数相同、必存在某种染色等)。
第一抽屉原理:若把 $N$ 个物体放入 $K$ 个抽屉中,且 $N > K$:
第二抽屉原理 (加强版):若把 $N$ 个物体放入 $K$ 个抽屉中,则:
其中 $\lceil x \rceil$ 代表向上取整。例如将 8 只鸽子放入 3 个巢,必然有一个巢含有 $\lceil 8/3 \rceil = 3$ 只或更多鸽子。
// 鸽巢原理应用:检验数组中是否存在重复数字
// 给定一个长度为 N 的数组,元素值都在 [1, N-1] 范围内
bool hasDuplicate(int arr[], int n) {
// 抽屉数为 N-1,物体数为 N
// 根据鸽巢原理,必然存在至少一个数字重复
vector<int> freq(n, 0);
for (int i = 0; i < n; i++) {
freq[arr[i]]++;
if (freq[arr[i]] >= 2) {
return true; // 碰撞成功,发现重复
}
}
return false;
}