有效三角形的个数
题目链接 611. 有效三角形的个数
给定一个包含非负整数的数组
nums
,返回其中可以组成三角形三条边的三元组个数。示例 1:
输入: nums = [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3
示例 2:
输入: nums = [4,2,3,4] 输出: 4
题目解释
从数组中跳出三个元素,判断他是否可以组成三角形.
算法原理
我们知道三个数是否可以组成三角形的条件是任意两条边的和大于第三边,实际上只需让较小的两条边之和大于第三边即可.那么这个时候我们是否可以做.
- 将我们的数组排序
- 固定一个最大的值,然后遍历其他的,判断是否可以组成三角形
下面说我们一次遍历的流程,使用碰撞双指针.
- left = 0, right = i-1
- 如果他们的和小于固定的值, left++
- 如果他们的和大于固定的值, 收集结果,然后right–,看看后面还有没有结果
细节补充
这里还是两个细节
- 我们需要保证我们的每一次的遍历的元素至少是3个
- left是要小于right的
代码编写
class Solution
{
public:
int triangleNumber(vector<int> &nums)
{
sort(nums.begin(), nums.end());
int i = nums.size() - 1;
int result = 0;
for (; i >= 2; --i)
{
int left = 0;
int right = i - 1;
while (left < right)
{
if (nums[left] + nums[right] > nums[i])
{
result += (right - left);
right--;
}
else
{
left++;
}
}
}
return result;
}
};