优选算法——双指针5(单调性)

🔥近津薪荼:个人主页

🎬个人专栏:《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.预告

下期要讲解的题目是:

LCR 179. 查找总价格为目标值的两个商品(点击跳转)

家人们,下期再见~~

相关推荐
idontknow2332 小时前
DPDK学习笔记(1):二层转发应用例代码解析
c语言·网络·笔记·学习
2401_857683542 小时前
C++代码静态检测
开发语言·c++·算法
时艰.2 小时前
JVM 垃圾收集器(G1&ZGC)
java·jvm·算法
2401_838472512 小时前
内存泄漏自动检测系统
开发语言·c++·算法
GHL2842710902 小时前
Docker Desktop 启动报错“Virtualization support not detected“
c++·docker·容器
m0_706653232 小时前
基于C++的爬虫框架
开发语言·c++·算法
求真求知的糖葫芦2 小时前
耦合传输线分析学习笔记(八)对称耦合微带线S参数矩阵推导与应用(上)
笔记·学习·矩阵·射频工程
diediedei2 小时前
嵌入式数据库C++集成
开发语言·c++·算法
2501_942326442 小时前
掌握脑科学记忆法,助力孩子高效学习
学习