给定一个包含非负整数的数组
nums
,返回其中可以组成三角形三条边的三元组个数。
输入: nums = [2,2,3,4]
输出: 3
解释:有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
int cmp(const void *a, const void *b) {
return *(int *)b - *(int *)a;
}
int triangleNumber(int* nums, int numsSize){
int i, j, k;
int ans = 0;
qsort(nums, numsSize, sizeof(int), cmp);//从大到小进行排列
for(i = 0; i <=numsSize-2; ++i) { //确定一个最大的边(三角形满足就是最大的边小于剩下两个边的和)
int l = i+1,r = numsSize-1;//利用双指针进行确定
while(l<r){
if(nums[l] + nums[r]<=nums[i]){
r--;
}
else{
ans+=r-l; //l-r的意思是当满足条件的时候,l到r的之间的数全满足,所以利用l-r进行计算
l++;
}
}
}
return ans;
}