5.LeetCode算法习题讲解--双指针--有效三角形的个数

一.题目

习题链接:611. 有效三角形的个数 - 力扣(LeetCode)

二.题目讲解

注意:重复的也要统计在内

三.算法原理讲解

想要解决这道题首先要明确的是满足三角形的条件:任意两边之和大于第三边,但是这需要三个条件,我们可以简化为一个条件,即两个较小数之和大于最大的那一个就可以

我们首相想到的就是把所有情况都给遍历一遍,然后统计个数,但是这样效率会很低,这里我们利用双指针来实现:

下面我们举例分析:

首先我们需要将数组进行排列,然后定住最右边的那个数(10),给出两个指针一个指向最左边(2),一个指向最右边小于最大那个数(9),当left和right指向的两个数相加会出现两种情况:

一种是 a+b>c 可以构成三角形 ;另一种是 a+b<=c 不可以构成三角形

第一种:由于2+9已经大于10了,数组又是按升序排列,所以 2 , 9之间的数都要比2大,中间的数与9相加都会大于10,这时中间的数任意一个和9,10组合都能构成三角形,所以构成三角形的个数就是 right-left ,然后让 right-- ,最大数减小再次判断是否还大于c

第二种:由于2+9已经大于10了,数组又是按升序排列,所以 2 , 9之间的数都要比9小,中间的数与2相加都会小于10,这时中间的数任意一个和9,10组合都不能构成三角形,所以这时就需要让最小数left++,指向更大的数再次与9相加判断是否大于10

第一层循环结束的条件是 left >= right 这时说明以10为基准数的情况已经遍历完了,然后让c--,再次循环来找可以组合的情况

四.编写代码

cpp 复制代码
class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int num = 0;
        int c = nums.size() - 1;
        while(c > 1)
        {
            int left = 0, right = c - 1;
            while(left < right)
            {
                if(nums[left] + nums[right] > nums[c])
                {
                    num += right - left;
                    right--;
                }
                else
                {
                    left++;
                }
            }
            c--;
        }
       return num;
    }
};
相关推荐
招聘风控观察8 小时前
招聘质量管理是什么?招聘质量的定义与评价口径完整解释
职场和发展
徐小夕8 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao8 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄9 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘5610 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
y1su12 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan12 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
其实防守也摸鱼13 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机13 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS10013 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构