1. 思路解析
根据题意我们可知,我们需要在指定数组中找出任意三个数并判断是否可以组成一个三角形,即任意两数之和大于第三个数,任意两数之差小于第三个数,如果有数组元素相同的数组,由于取出的元素只是数值相同而实际在原数组下标不同,所以可以看做两个三角形
2. 算法原理
这里补充一下关于判断三角形的知识,那就是两个较小数之和大于最大数则是一个三角形,这样就只用判断一次即可。这里的思路是首先对目标数组进行排序,然后固定最大的数,在剩下数字的区间内,将头尾设置两个指针,判断相加是否大于最大值,若大于则此时满足三角形有 right - left 个,右指针左移随后继续判断,反之左指针右移,最终返回满足三角形的个数即可
3. 代码展示
class Solution {
public:
int triangleNumber(vector<int>& nums)
{
//1.优化数组,进行排序
sort(nums.begin(),nums.end());
int sum = 0;
int n = nums.size();
for(int i = n - 1;i >= 2;i--)
{
//2.使用双指针解决问题
int left = 0;
int right = i - 1;
while(left < right)
{
if(nums[left] + nums[right] > nums[i])
{
sum += right - left;
right--;
}
else
{
left++;
}
}
}
return sum;
}
};