【算法专题】双指针—有效三角形的个数

一、题目解析

题目链接:有效三角形的个数

我们知道想要组成一个三角形那么其任意两边之和必定大于第三边,即

但是如果我们知道这三条边的大小顺序,那么只需判断一次即可,假设c是最大的那条边,那么不等式②和③不用判断自然也就成立了。

二、算法原理

解法一:排序+暴力求解(时间复杂度:O(n^3))

三层for循环枚举出所有的三元组,并且判断是否能构成三角形,但是这个暴力求解也是可以稍微优化一下的,对原数组进行排序,在判断较小的两条边之和大于第三边即可,不过也会超时。

cpp 复制代码
class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int ret = 0;
        int n = nums.size();
        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])
                    {
                        ret++;
                    }
                }
            }
        }
        return ret;
    }
};

解法二:排序+双指针(时间复杂度:O(n^2))

  1. 排序
  2. 先固定最大的数
  3. 在最大的数的左区间内,使用双指针算法,快速统计出符合要求的三元组的个数

这种方法可以减少枚举的次数,最后再固定下一个最大值继续重复此方法向后枚举。

三、代码编写

cpp 复制代码
class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int ret = 0;
        int n = nums.size() - 1;
        for(int i = n; 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;
    }
};

如有写的不好或有错误的地方还望指出,谢谢

相关推荐
闻缺陷则喜何志丹25 分钟前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考
CoovallyAIHub27 分钟前
如何在手机上轻松识别多种鸟类?我们发现了更简单的秘密……
深度学习·算法·计算机视觉
第二只羽毛33 分钟前
遵守robots协议的友好爬虫
大数据·爬虫·python·算法·网络爬虫
BestOrNothing_20151 小时前
一篇搞懂 C++ 重载:函数重载 + 运算符重载,从入门到会用(含 ++、<<、== 实战)
c++·函数重载·运算符重载·operator·前置后置++·重载与重写
艾斯比的日常1 小时前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
2501_941144421 小时前
Python + C++ 异构微服务设计与优化
c++·python·微服务
CoovallyAIHub1 小时前
抛弃LLM!MIT用纯视觉方法破解ARC难题,性能接近人类水平
深度学习·算法·计算机视觉
程序猿编码1 小时前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince
高洁011 小时前
具身智能-视觉语言导航(VLN)
深度学习·算法·aigc·transformer·知识图谱
Croa-vo1 小时前
TikTok 数据工程师三轮 VO 超详细面经:技术深挖 + 建模推导 + 压力测试全记录
javascript·数据结构·经验分享·算法·面试