力扣每日一题 611. 有效三角形的个数
其实知道怎么判断三个数能否组成三角形就可以了,任意两边之和大于第三边,但还有另一种方法,把数字从小到大排序a,b,c。如果a+b>c就可以组成,否则就不行
考虑到数据范围是1e3,显然三重循环进行暴力是不可行的,很自然想到把数组进行排序,然后枚举两条边,二分查找第三条边的可选范围
我使用lower_bound找到第一个大于等于的数字,也就是最小的那个不可用的值的位置。
顺便注意一下特殊情况,0是无法构成三角形的一条边的,所以需要丢弃,同时特判一下只有两条边的情况
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;}