给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问可以找到多少组这样的三个数来组成三角形
思路:如果暴力枚举,那么是O(n^3)的时间复杂度,每次枚举都没有利用前面的信息。考虑如下情况,假定这个数组排序后的长度序列是X1<=X2<=.....Xn,考虑如下两种情况:i<j<k
1.如果有Xi,Xj,Xk能构成三角形,那么Xm(i+1<=m<=j-1),Xj 与 Xk均能构成三角形
2.如果有Xi,Xj,Xk不能构成三角形,那么Xi,Xm(i+1<=m<=j-1)与 Xk均不能构成三角形
首先指定最长边为数组的末尾元素,头指针指向第一个元素,尾指针指向末尾元素的前一个元素,根据上述情况,统计以数组的末尾元素为最长边时,三角形的个数。依次统计,直至指定最长边为第3个元素。
class solution{ public int triangleCount(int[] S) { if(S==null||S.length<=2) return 0; Arrays.sort(S); int i,j,k; int count=0; for(k=S.length-1;k>=2;k--){ i=0; j=k-1; while(i<j){ if(S[i]+S[j]<=S[k]){//如果是这种情况,那么S[i]与S[i+1~j-1]之间的任何数,都不能构成三角形 i++; } else{ count+=j-i;// 如果是这种情况,那么S[j]与S[i+1~j-1]之间的任何数,都能构成三角形 j--; } } } return count; } }