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;
    }
};
相关推荐
苏打豆34 分钟前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的1 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙1 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
zhangfeng11332 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu
学代码的CJY2 小时前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
白帽攻防录2 小时前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
小O的算法实验室3 小时前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法
可乐ea4 小时前
AI Agent 工具调用准确性评测:选择错误与参数错误分开测
大数据·人工智能·算法·大模型·工具调用·ai智能体·agent评测
上位机妹子4 小时前
C 语言 数组删除指定元素(快慢指针法)
c语言·数据结构·算法
心中有你02144 小时前
【路径规划】A*寻路算法最通俗易懂讲解(C语言完整实现+详细注释)
c语言·开发语言·算法