欢迎来到CILMY23的博客
🏆本篇主题为:双指针算法之611. 有效三角形的个数(力扣)
🏆个人主页:CILMY23-CSDN博客
🏆系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题
🏆感谢观看,支持的可以给个一键三连,点赞关注+收藏。
题目:
611. 有效三角形的个数 - 力扣(LeetCode)
一、题目解析
题目给了我们一个非负整数的数组nums,
- 求可以组成三角形三条边的三元组个数。
现在就是回到如何组成一个三角形了。假设三角形的三条边是a,b,c,那么
两边之和大于第三边并且两边之差小于第三边。
以及 |a-b| > c.
因此可以先写一个模块化的函数用来判断三角形是否成立。
//判断三角形是否成立
bool Triangle(int a,int b ,int c)
{
if(a+b>c && a+c>b && b+c>a && fabs(a-b) < c || a == b == c)
{
return true;
}
return false;
}
二、算法原理
当我们全部都遍历数组后,并且测试
那说明暴力破解这题是不可取的了,那回看代码发现
优化的点有两个
1.判断三角形能否更简化
2.能否不全部遍历数组
所以我们需要对数组进行一个排序
排完序后,我们判断三角形的条件就简单了,a+b>c即可
现在我们对排完序的数组进行分析,首先固定一个最大的数C,双指针控制a和b,枚举最小的a和最大的除c以外的b
假设a+b>c,那么因为我们排序了,所以我们知道从a到b中间的任何一个值拿来替换a都是可以满足a+b>c这个条件的。
假设a+b<=c ,那也因为我们排序了,b已经是除C以外最大的数了,那么a还有提升空间,a不满足,我们就让a变大,所以a只需要往前走即可。
找到a+b满足大于c直到相遇,循环结束,所有可能的组合都完成了 ,时间复杂度就变成了O(n*n)。
三、代码编写
class Solution
{
public:
//判断三角形是否成立
bool Triangle(int a,int b ,int c)
{
if(a+b>c)
{
return true;
}
return false;
}
int triangleNumber(vector<int>& nums)
{
int time = 0;
//对数组进行排序
sort(nums.begin(),nums.end());
for (int c = nums.size()-1;c>=2;c--)//确定C的位置
{
int left = 0;
int right = c-1;
while(left < right)
{
if(Triangle(nums[left],nums[right],nums[c])== true)
{
time += right - left;
right--;
}
else
{
left++;
}
}
}
return time;
}
};
🛎️感谢各位同伴的支持,本期C++算法专题就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞,关注+收藏,若有不足,欢迎各位在评论区讨论。