当前位置: 首页 > article >正文

leetcode刷题:611.有效三角形的个数(双指针实现)

题目地址:有效三角形的个数


解决此题时,首先需要知道的是如何判断三个数字是否能够构成三角形。

我们知道,三角形任意两边之和都大于第三边。所以判断三个数字是否能构成三角形需要进行三次比较(最基础的思路)

方法一:暴力枚举

此题一个最容易想到的解法就是暴力遍历。即穷举法,列举出每一种可能的组合情况并进行判断。不难想到需要设置三重循环,时间复杂度是O(n^3)。但是这种方法可能会有超时的风险(也许使用C/C++能够侥幸通过,但如果使用python之类较慢的语言大概率无法通过)

方法二:双指针

上述我们已经给出了判断三个数是否构成三角形的方法,然而三次判断其实也比较繁琐,是否可以实现一次判断呢?

其实我们在数学学习中肯定知道一种方法,那就是判断三个数中较小的两个数之和与最大数的大小关系。因为只要最小的数加起来大于最大的数,那么这三个数无论如何组合,最后得到的结果肯定都是满足三角形的性质的。

因此我们就可以采取这样一种思想来设计算法。首先找到最大的数,然后对于剩余的数进行排列组合,判断它们的和是否大于最大的数。

为了找到最大的数,我们可以先将原数组进行升序排序。此时可以知道最大的数就在数组尾端。此时设置双指针,分别指向剩余数组中的最小数与最大数。通过操作双指针进行判断。

如何控制双指针的指向呢?我们可以以下列例子来简单模拟一下:

 

需要注意的是,max至少需要指向第三个元素(下标为2),因为至少需要三条边才能构成一个三角形。

采用双指针方法时间复杂度为O(n^2),相较于暴力解法有很大提升。

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int ret=0;
        int 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;
    }
};

 


http://www.kler.cn/news/160961.html

相关文章:

  • C++中单引号‘‘和双引号““的区别
  • Linux内核上游提交完整流程及示例
  • 多人聊天室
  • Python实现广义线性回归模型(statsmodels GLM算法)项目实战
  • Oracle 查询语句限制只选择最前面几行,和最后面几行的实现方式。
  • GAN:WGAN前作
  • 【玩转TableAgent 数据智能分析】-- 数据分析不再是专业人士的专利
  • 如何使用Net2FTP轻松部署本地Web文件管理器并远程访问管理内网资源?
  • [⑦ADRV902x]: JESD204学习笔记
  • 【Spark基础】-- 宽窄依赖
  • 【学习笔记】插值之拉格朗日插值(Lagrange)
  • springboot中@Builder注解的详细用法实例,跟数据库结合。
  • Leetcode226. 翻转二叉树
  • Python语言基础知识(一)
  • 第三方实验室LIMS管理系统源码,asp.net LIMS源码
  • java实现Modbus通信
  • 文心一言大模型应用开发入门
  • 外汇市场中的多头和空头究竟是什么?如何通过K线图来辨别它们呢?
  • 快速排序并不难
  • 0008Java程序设计-ssm校友录网站小程序
  • docker安装配置prometheus+node_export+grafana
  • 香港科技大学广州|机器人与自主系统学域博士招生宣讲会—北京专场!!!(暨全额奖学金政策)
  • 【微信小程序开发】小程序的事件处理和交互逻辑(最详细)
  • 前端数据加密相关问题
  • LLM之RAG实战(一):使用Mistral-7b, LangChain, ChromaDB搭建自己的WEB聊天界面
  • Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)
  • k8s之Pod常用命令详解、镜像拉取策略(imagePullPolicy)
  • 学生成绩管理系统(Java)
  • 深入React Flow Renderer(二):构建拖动操作栏
  • 什么是SPA(Single Page Application)?它的优点和缺点是什么?