其实知道怎么判断三个数能否组成三角形就可以了,任意两边之和大于第三边,但还有另一种方法,把数字从小到大排序a,b,c。如果a+b>c就可以组成,否则就不行
考虑到数据范围是1e3,显然三重循环进行暴力是不可行的,很自然想到把数组进行排序,然后枚举两条边,二分查找第三条边的可选范围
我使用lower_bound找到第一个大于等于的数字,也就是最小的那个不可用的值的位置。
顺便注意一下特殊情况,0是无法构成三角形的一条边的,所以需要丢弃,同时特判一下只有两条边的情况
cpp
int triangleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int len = nums.size();
if (len <3) return 0;
int ans=0;
for (int i=0; i<len; ++i)
{
if (nums[i]==0) continue;
for (int j=i+1; j<len; ++j)
{
auto pos = lower_bound(nums.begin(), nums.end(), nums[i]+nums[j]);
if (pos == nums.end())
{
ans += len-j-1;
}
else
{
ans += pos - (nums.begin()+j) -1;
}
}
}
return ans;
}