有效三角形的个数

给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。

输入: [2,2,3,4]
输出: 3
解释:
有效的组合是: 
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3

数组长度不超过1000。

数组里整数的范围为 [0, 1000]。

 

三条边要能构成三角形,必然满足两边之后大于第三边。也就是三条边长度分别是a,b,c,满足a+b>c的都可以组成三角形。这和前面的求小于K的两数之后的原理是一样的。

 

1 对数组进行排序,这个时候从右边选定c,也就是最长的一条边。

2 然后对c之前的数组求两数之和。大于c的则满足条件。

 

代码如下:

int triangleCount(int a[], int len)

{

    int left, right, anchor;

    int count = 0;

    insert_sort(a, len);

    for (int i = len - 1; i >= 2; i--)

    {

        //left从左边开始,right从i之前的最右边开始

        left = 0;

        right = i - 1;

        while (left < right)

        {

             if (a[left] + a[right] > a[i])

             {

                 //如果满足条件,则表示从left到right之间的数字和right相加都满足大于c的条件。因为数组是递增的

                 count += right-left;

                 right--;

             }

             else

             {

                 //不满足条件,则left+1 向前继续寻找

                 left += 1;

             }

        }

    }

    return count;

 

}

 

posted @ 2019-10-16 09:56  red_leaf_412  阅读(513)  评论(0编辑  收藏  举报