lintcode 382.三角形个数

给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问可以找到多少组这样的三个数来组成三角形

思路:如果暴力枚举,那么是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;
    }
}



猜你喜欢

转载自blog.csdn.net/thyzy120605/article/details/80708980