给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例 1:
输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3
注意:
数组长度不超过1000。
数组里整数的范围为 [0, 1000]。
C
int triangleNumber(int* nums, int numsSize)
{
if(numsSize<3)
{
return 0;
}
sort(nums,0,numsSize-1);
int count=0;
for(int i=numsSize-1;i>=2;i--)
{
int left=0;
int right=i-1;
while(left<right)
{
if(nums[left]+nums[right]>nums[i])
{
count+=right-left;
right--;
}
else
{
left++;
}
}
}
return count;
}
void sort(int *a, int left, int right)
{
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[i];
while(i < j)
{
while(i < j && key <= a[j])
{
j--;
}
a[i] = a[j];
while(i < j && key >= a[i])
{
i++;
}
a[j] = a[i];
}
a[i] = key;
sort(a, left, i - 1);
sort(a, i + 1, right);
}
C++
class Solution {
public:
int triangleNumber(vector<int>& nums)
{
int n=nums.size();
if(n<3)
{
return 0;
}
sort(nums.begin(),nums.end());
int count=0;
for(int i=n-1;i>=2;i--)
{
int left=0;
int right=i-1;
while(left<right)
{
if(nums[left]+nums[right]>nums[i])
{
count+=right-left;
right--;
}
else
{
left++;
}
}
}
return count;
}
};
python
class Solution:
def triangleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n=len(nums)
if n<3:
return 0
nums=sorted(nums)
nums=nums[::-1]
count=0
for i in range(0,n-2):
left=i+1
right=n-1
while left<right:
if nums[left]+nums[right]>nums[i]:
count+=(right-left)
left+=1
else:
right-=1
return count