
🔥近津薪荼:个人主页
🎬个人专栏:《c语言基础知识详解》《c++基础知识详解》《Linux操作系统及网络基础知识分享》《近津薪荼的算法日迹》
做难事必有所得
本期知识点导图:

1.上期参考代码
cpp
class Solution {
public:
int maxArea(vector<int>& height) {
int left=0,right=height.size()-1,vm=0;//定义双指针
while(left<right)
{
int w=right-left;
int h=min(height[left],height[right]);
int v=h*w;
vm=v>vm?v:vm;//如果算出来的体积比vm大,二者交换
if(height[left]<height[right])
left++;
else
right--;
}
return vm;
}
};
上期的代码书写难度上不是很大,只要逻辑搞清,我相信大家都能写出来的~
2.题目解析

题目就一句话,要注意的就是值相同的不同元素组成的三元组算数(不去重),题给提示中也写的非常清楚了,不再赘述。
3.解题思路
3.1暴力解法
直接嵌套三层for循环遍历数组,穷举出所有三元组,然后进行逻辑判断,计数器计数。
cpp
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int n=nums.size(),sum=0;
sort(nums.begin(),nums.end());//这里先排序,不排序过不了
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
for(int k=j+1;k<n;k++)
if(nums[i]+nums[j]>nums[k])//排序之后只需要进行一次逻辑判断。
sum++;
return sum;
}
};
我们判断三条边能否构成三角形,要看其两边之和大于第三边
即a+b>c,b+c>a,a+c>b;这样就需要进行三次逻辑判断
本来嵌套了3层for,时间复杂度就是O(N^3) 了,还要再乘以3倍,变成O(3N^3)
但如果数组本身是有序的,我们只需要进行一次逻辑判断:a+b>c即可;
先排序再利用数组单调性进行逻辑判断的话,时间复杂度为**N*lgN+O(N^3)显然比O(3N^3)**小得多。
不了解什么是复杂度的同学移步这里~
3.2双指针解法
双指针算法,遍历过程中利用数组单调性,结合三角形两边之和大于第三边进行逻辑判断减少计算量。
- 首先还是先给数组排序,简化逻辑判断的步骤。
- 两边之和大于第三边,其中"两边"由双指针决定 ,第三边由最外层for循环决定。
for+双指针 ,这是遍历有序数组找符合要求 的三元组的常见方法。

逻辑:
1.for循环作为外层循环,i移动的速度慢,比如这里把i放在n-1的位置,固定主9这个"第三边"。
2."第三边"固定之后,left和right开始工作:
2.1判断此时left和right之和是否大于第三边
2.2如果小于等于第三边,则left++,直到left和right之和大于第三边(依赖单调性)。
2.3如果大于 第三边,满足条件的三元组个数就是此时的right-left的值,此时right--,因为此时已经大于第三边的情况下,left再往后走必然满足条件,所以无需再进行判断了,(依赖于单调性)

2.3当left于right相遇时,结束本次循环,进入下次循环,直至遍历结束。
依旧劝敲:
大家回头自己一定动手敲一遍代码啊,光输入不输出,等于没输入~
4.预告
下期要讲解的题目是:
家人们,下期再见~~
