一道笔试编程题要求求一个大三角形中所有小三角形的个数,大约是下面这种情况:
首先想到是的将问题由求边长为n的三角形个数->求边长为n-1的三角形个数->...求边长为1的三角形个数=1,回溯求得所有三角形个数。但是再仔细一看因为有重叠三角形和倒置的三角形,所以这个方法不可行。
接着找到三角形个数由三部分组成:
1,边长为1的小三角形个数=n*n
2,边长为2到n的小三角形个数=(1+2+...+n-1)+(1+2+...n-2)+...+1
3,当边长大于3时,倒置的小三角形个数=i从n-3开始每次减2直到小于等于0,,所有sum(1...i),即sum(i=n-3,sum(1...i),i-=2)
public static int countTheTriangle(int n){
if(n==0) return 0;
int sum=1;
if(n>=2){
sum+=n*n;
for(int i=n-1;i>1;i--){
sum+=(1+i)*i/2;
}
if(n>=4){
for(int i=n-3;i>0;i-=2){
sum+=(1+i)*i/2;
}
}
}
return sum;
}
应该还有数学方法直接求出来的,但是没有找到