优选算法——双指针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. 查找总价格为目标值的两个商品(点击跳转)

家人们,下期再见~~

相关推荐
power 雀儿40 分钟前
Scaled Dot-Product Attention 分数计算 C++
算法
琹箐1 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
戌中横1 小时前
JavaScript——预解析
前端·javascript·学习
renhongxia12 小时前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了2 小时前
数据结构之树(Java实现)
java·算法
算法备案代理2 小时前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
●VON2 小时前
React Native for OpenHarmony:2048 小游戏的开发与跨平台适配实践
javascript·学习·react native·react.js·von
ZH15455891312 小时前
Flutter for OpenHarmony Python学习助手实战:自动化脚本开发的实现
python·学习·flutter
赛姐在努力.2 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
xcLeigh2 小时前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests