如何计算指定宽高范围内唯一宽高尺寸对的数量?
这其实是个经典的无序组合计数问题,不用循环遍历的话,咱们可以用集合交集和组合数学来快速算出结果,我给你拆解清楚:
步骤1:先明确各范围的元素数量
首先把你的数值范围转换成具体的元素个数:
- 宽度集合(10到50):
50 - 10 + 1 = 41个不同值 - 高度集合(20到40):
40 - 20 + 1 = 21个不同值 - 两个集合的交集(同时属于宽和高的数值,即20到40):共21个不同值
步骤2:分三类计算唯一无序对
我们要统计的是不重复的无序对{W,H}(也就是(W,H)和(H,W)视为同一个),可以拆成三类分别计算:
第一类:宽和高都在交集区间(20-40)内
这部分又分两种情况:
- 宽=高的配对:每个数值自己和自己组合,共21个唯一对
- 宽≠高的配对:从21个数值里选2个不同的,用组合数公式
C(n,2) = n*(n-1)/2,计算得21*20/2 = 210个唯一对
这部分总计:21 + 210 = 231
第二类:宽在10-19(不在交集),高在20-40
因为这部分的宽都小于高的最小值20,所以所有(W,H)都是W<H,不存在反向的(H,W)合法配对(高的范围里没有10-19的数),每个组合都是唯一的。数量为:10 * 21 = 210(10是10-19的元素个数)
第三类:宽在41-50(不在交集),高在20-40
同理,这部分的宽都大于高的最大值40,所有(W,H)都是W>H,反向的(H,W)也不在合法范围内(高的范围里没有41-50的数),每个组合都是唯一的。数量为:10 * 21 = 210(10是41-50的元素个数)
步骤3:总数量求和
把三类的结果加起来:231 + 210 + 210 = 651
更简洁的一步式计算
如果你想直接用公式一步算出,也可以用「总有序对数量 - 重复计数」的思路:
- 总有序对数量:所有宽和高的配对数,即
41 * 21 = 861 - 重复的计数:只有当宽和高都在交集里且不相等时,才会出现(W,H)和(H,W)重复的情况,这部分重复的数量就是组合数
C(21,2) = 210(每个无序对被算了两次,需要减去一次重复) - 最终结果:
861 - 210 = 651,和分步计算的结果完全一致。
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

