为什么是 n(n+1)/2 ?
n(n+1)/2是一个数列的元素两两运算后的不重复结果数。如图:

假如数列a = 1,2,3....n。那么该数列内的元素两两相乘,则会构建出上图中的表格,这个表格应该有n x n 个元素。
用程序写出来大概就是这样:
for (int i=; i<n; i++){
for (int j=; j<n; j++){
table[i][j] = a[i]*a[j];
}
}
这段程序准确的描述了我们手工填表的过程,填满整个表一共执行了n*n次操作,产生了一个n*n的结果集,当然也包含大量重复元素。
那么到底有多少重复元素呢? 其实可以通过跟踪整个运算流程来观察出其中的规律。
1.当i=1时, a1 * a1, a1*a2.....a1*an 一切正常。
2.当i=2时, a2 * a1, a2*a2.....a2*an 看到第一项了么,在第一步时已经计算过一次了。
3.当i=3时,a3 * a1, a3*a2, a3* a3....a3*an 第一项在i=1时计算过,第二项在i=2时计算过。
依次类推,可以发现,当i=n的时候,除了an * an 需要计算以外,其他项全都已经计算过了。
现在让我们来一次时光倒流:从i=n的时候开始,他只有最后一次计算是不重复的(an*an),其余n-1次运算都是"徒劳",所以它产生了n-1个重复元素。
然后是i=n-1的时候,他只有最后两次运算是不重复的(an-1 * an-1, an-1 * an),余下的n-2个计算结果都是重复的。
一直进行到当i=2的时候,也就是上面描述的第二步,当第一个重复数出现的时候。
然后就可以把他们都加起来,他们的和就是所有重复数了:r = 1+2+...+n-1
1 + 2 + ... + n-1 =r
2 n-1 + n-2 + ... + 1 =r
将1式和2式相加=> 2r = n(n-1) => r = n(n-1)/2
得到了重复数r,那么剩下多少不重复的呢? n*n - r = n(n+1)/2 wala~ QED
----Note---
这其实是一个可重复的N choose M 组合问题,而这里的M是2,有时间的话想好好证明一下这个问题
随机推荐
- Java对象访问 类的静态变量
Java类的静态变量用对象和类名都能访问,一般用类名,但如果用对象来访问静态变量呢,有何种效果? 测试一下: package JavaTest; public class test{ public s ...
- 【leetcode】Insert Interval
Insert Interval Given a set of non-overlapping intervals, insert a new interval into the intervals ( ...
- C#之枚举类型
参考: http://www.cnblogs.com/an-wl/archive/2011/04/14/2015815.html 惯例先上MSDN: https://msdn.microsoft.co ...
- logging模块使用示例
日志等级说明: UNSET < DEBUG < INFO < WARNNING < ERROR < CRITICAL import logging logger = l ...
- 解决IDEA自动重置LanguageLevel和JavaCompiler版本的问题
使用IDEA时,导入的Maven项目默认的LanguageLevel和JavaCompiler都是1.5,1.5的情况下连最简单的@Override注解都不支持,所以项目可能出现一堆错. 虽然在项目上 ...
- selenium WebDriver 操作高德地图
String URL="http://www.amap.com/"; WebDriver driver = new FirefoxDriver(profile); driver.g ...
- SQL触发器中若取到null值可能引发的问题
declare @code varchar(20), @cs varchar(20),@zc varchar(20)set @cs='('+@cs+'*'+@zc+')'print '字符'+@csi ...
- HDU 4940 Destroy Transportation system(无源汇有上下界最大流)
看不懂题解以及别人说的集合最多只有一个点..... 然后试了下题解的方法http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html 首先是无源汇有上下界最 ...
- mysql格式化整数类型时间生成年月日时分秒格式(long或string接收)
数据库格式: 数据库mysql语句: FROM_UNIXTIME( s.timemodified, '%Y-%m-%d %h:%i:%s' ) 生成结果: 测试sql为: SELECT *, FROM ...
- 【python】SQLAlchemy
来源:廖雪峰 对比:[python]在python中调用mysql 注意连接数据库方式和数据操作方式! 今天发现了个处理数据库的好东西:SQLAlchemy 一般python处理mysql之类的数据库 ...