【优选算法】5----有效三角形个数
又是一篇算法题,今天早上刚做的热乎的~
其实我是想写博客但不知道写些什么(就水一下啦)
-------------------------------------begin-----------------------------------------
题目解析:
这道题的题目算是最近几道算法题里面题目最短的,但是单单看题目的话,我就只知道有一个数
组,需要我们去返回其中符合三角形特性的三条边,所以我们可以从示例入手,了解这道算法需要
我们去实现的地方~
讲解算法原理:
先说暴力解法吧,我们就需要用到三个for循环来进行遍历,时间复杂度为O(n^3),在力扣上面肯
定是编译不过的,所以在这个基础上,我们需要优化算法~
新思路:我们可以将所给数组先进行排序,排序成单调递增的数组,两个指针left和right,left指
针从位置0向右遍历,right从n-1位置向左遍历,分两种情况,两指针所指数的和大于位置i的值和
小于位置i的值,再定义一个ret变量,用于储存有效三角形的个数~
编写代码:
class Solution
{
public:
int triangleNumber(vector<int>& nums)
{
sort(nums.begin(), nums.end());
int ret = 0, n = nums.size();
for(int i=n-1;i>=2;i--)
{
int left=0,right=i-1;
while(left<right)
{
if(nums[left]+nums[right]>nums[i])
{
ret+=right-left;
right--;
}
else
{
left++;
}
}
}
return ret;
}
};
差不多就是这个样子啦~
题目链接直达->
611. 有效三角形的个数 - 力扣(LeetCode)