给定一个包含非负整数的数组,你的任务是统计其中能够组成三角形三条边的三元组个数。数组
输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3spa
数组长度不超过1000。code
数组里整数的范围为 [0, 1000]。blog
三条边要能构成三角形,必然知足两边以后大于第三边。也就是三条边长度分别是a,b,c,知足a+b>c的均可以组成三角形。这和前面的求小于K的两数以后的原理是同样的。排序
1 对数组进行排序,这个时候从右边选定c,也就是最长的一条边。class
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; }