1.5 双指针专题:有效三⻆形的个数(medium)

1.题目链接

611. 有效三角形的个数 - 力扣(LeetCode)https://leetcode.cn/problems/valid-triangle-number/submissions/609232447/

2.题目描述

给定⼀个包含⾮负整数的数组 nums ,返回其中可以组成三⻆形三条边的三元组个数。

⽰例 1:

  • 输⼊: nums = [2,2,3,4]
  • 输出: 3

解释:有效的组合是:

  • 2,3,4 (使⽤第⼀个 2)
  • 2,3,4 (使⽤第⼆个 2)
  • 2,2,3

⽰例 2:

  • 输⼊: nums = [4,2,3,4]
  • 输出: 4

解释:

  • 4,2,3
  • 4,2,4
  • 4,3,4
  • 2,3,4

3.算法思路

该算法用于计算数组中能构成三角形的三元组数量,通过排序与双指针法高效遍历可能组合。核心思路是固定最长边,寻找满足两边之和大于第三边的较小边组合。具体步骤如下:


1. 排序预处理

  • 将数组 nums 升序排序,使得后续能通过双指针快速定位有效组合。

  • 目的:三角形的边长需满足 a+b>ca+b>c(假设 a≤b≤ca≤b≤c),排序后只需固定 cc 并寻找 aa 和 bb 的组合。


2. 外层循环固定最长边

  • 从最大值开始遍历,设当前最长边为 nums[i]i 从 n-1 递减到 2)。

  • 原因:固定 c=nums[i]c=nums[i] 后,只需在 [0, i-1] 范围内寻找满足 a+b>ca+b>c 的 aa 和 bb。


3. 双指针寻找有效组合

  • 初始化:左指针 left = 0,右指针 right = i - 1

  • 条件判断

    • 若 nums[left] + nums[right] > nums[i],则 left 到 right-1 的所有元素与 right 均满足条件,累加组合数 ret += right - left,并左移 right 以尝试更小的右边界。

    • 否则,右移 left 以增大最小边,尝试满足条件。

  • 终止:当 left >= right 时结束内层循环。


正确性证明

  • 组合计数逻辑
    当 nums[left] + nums[right] > nums[i] 时,由于数组有序,nums[left ... right-1] 均满足与 nums[right] 的和大于 nums[i],因此可直接累加 right - left 个组合。

  • 指针移动策略
    移动较小边(left)或较大边(right)确保不漏解。若和不足,必须增大较小边;若和足够,则记录所有可能组合后缩小较大边。


示例分析

  • 输入nums = [2, 3, 4, 5]

    • 排序后为 [2, 3, 4, 5]

    • 外层循环 i=3(最长边5)

      • left=0right=2 → 2+4=6>5 → 累加 2-0=2 个组合((2,4,5)、(3,4,5))。

      • right=1 → 2+3=5≯5 → left++ → 循环结束。

    • 外层循环 i=2(最长边4)

      • left=0right=1 → 2+3=5>4 → 累加 1-0=1 个组合((2,3,4))。

    • 总计:3 个有效三元组。


复杂度分析

  • 时间复杂度O(n²)

    • 排序耗时 O(nlog⁡n)O(nlogn)。

    • 双指针遍历嵌套循环耗时 O(n2)O(n2)(外层循环 O(n)O(n),内层循环均摊 O(n)O(n))。

  • 空间复杂度O(1)

    • 仅使用常量额外空间(排序栈空间为 O(log⁡n)O(logn),通常不计入)。


关键点总结

  • 排序的必要性:通过有序性快速缩小搜索范围,避免暴力枚举。

  • 双指针的优化:将组合数计算从 O(n3)O(n3) 优化至 O(n2)O(n2)。

  • 贪心策略:固定最长边后,动态调整双指针确保不漏解,高效统计有效组合。


4.代码实现

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984965.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习(59)-DataX执行机制

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

《面向对象程序设计-C++》实验一 熟悉Visual C++开发环境及上机过程

一、实验目的 了解和使用VC集成开发环境&#xff1b;熟悉VC环境的基本命令和功能键&#xff1b;熟悉常用的功能菜单命令&#xff1b;学习使用VC环境的帮助&#xff1b;学习完整的C程序开发过程&#xff1b;理解简单的C程序结构。 二、实验内容 使用Visual C 6.0集成环境来编…

Chebykan wx 文章阅读

文献筛选 [1] 神经网络&#xff1a;全面基础 [2] 通过sigmoid函数的超层叠近似 [3] 多层前馈网络是通用近似器 [5] 注意力是你所需要的 [6] 深度残差学习用于图像识别 [7] 视觉化神经网络的损失景观 [8] 牙齿模具点云补全通过数据增强和混合RL-GAN [9] 强化学习&#xff1a;一…

2025解决软件供应链安全,开源安全的版本答案:SCA+SBOM

GitHub&#xff1a; https://github.com/XmirrorSecurity/OpenSCA-cli/ Gitee&#xff1a; https://gitee.com/XmirrorSecurity/OpenSCA-cli/ OpenSCA官网&#xff1a; https://opensca.xmirror.cn/ 根据Sonatype 发布的《软件供应链现状》报告&#xff0c;其中强调软件供…

Linux 系统负载过高的排查思路

技术探讨&#xff1a;Linux系统负载过高的排查思路 在Linux服务器运行过程中&#xff0c;如果系统负载过高&#xff0c;可能会导致性能下降和服务不稳定。以下是针对Linux系统负载过高问题的排查思路和解决方法&#xff1a; 1. 查看系统负载&#xff1a; 使用uptime或top命令查…

typora高亮方案+鼠标侧键一键改色

引言 在typora里面有一个自定义的高亮, <mark></mark>>但是单一颜色就太难看了, 我使用人工智能, 搜索全网艺术家, 汇集了几种好看的格式,并且方便大家侧键一键 调用, 是不是太方便啦 ! 示例 午夜模式 春意盎然 深海蓝调 石墨文档 秋日暖阳 蜜桃宣言 使用方法 …

自然语言处理文本分析:从词袋模型到认知智能的进化之旅

清晨&#xff0c;当智能音箱准确识别出"播放周杰伦最新专辑"的模糊语音指令时&#xff1b;午间&#xff0c;企业舆情系统自动标记出十万条评论中的负面情绪&#xff1b;深夜&#xff0c;科研人员用GPT-4解析百万篇论文发现新材料线索——这些场景背后&#xff0c;是自…

基于SSM+Vue+uniapp的考研交流(带商城)小程序+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

浙江大学:DeepSeek行业应用案例集(153页)(文末可下载PDF)

浙江大学&#xff1a;DeepSeek行业应用案例集&#xff08;153页&#xff09;&#xff08;文末可下载PDF&#xff09; 全文链接&#xff1a;浙江大学&#xff1a;DeepSeek行业应用案例集&#xff08;153页&#xff09;&#xff08;文末可下载PDF&#xff09; | AI探金 全文链接&…

深度学习分类回归(衣帽数据集)

一、步骤 1 加载数据集fashion_minst 2 搭建class NeuralNetwork模型 3 设置损失函数&#xff0c;优化器 4 编写评估函数 5 编写训练函数 6 开始训练 7 绘制损失&#xff0c;准确率曲线 二、代码 导包&#xff0c;打印版本号&#xff1a; import matplotlib as mpl im…

共享经济时代下,鲲鹏共享科技如何逆袭改命?

2016年&#xff0c;当共享充电宝顶着“资本泡沫”的质疑横空出世时&#xff0c;没人能想到&#xff0c;这个曾被王思聪嘲讽“能成我吃翔”的行业&#xff0c;竟在短短几年内成为共享经济领域最顽强的幸存者。数据显示&#xff0c;2019年共享充电宝用户规模突破3亿&#xff0c;单…

说一下spring的事务隔离级别?

大家好&#xff0c;我是锋哥。今天分享关于【说一下spring的事务隔离级别&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说一下spring的事务隔离级别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring的事务隔离级别是指在数据库事务管理中…

Web开发第五节

一.结构伪类选择器 &#xff08;一&#xff09;选择单个 &#xff08;二&#xff09;选择多个 注&#xff1a;1.n5指的是5以后的数字&#xff0c;包含5&#xff0c;n从0开始 2.-n5指的是5以前的数字&#xff0c;同样包含5&#xff0c;并且n从0开始 二.伪元素选择器 注&…

计算机毕业设计:驾校综合信息系统

驾校综合信息系统mysql数据库创建语句驾校综合信息系统oracle数据库创建语句驾校综合信息系统sqlserver数据库创建语句驾校综合信息系统springspringMVChibernate框架对象(javaBean,pojo)设计驾校综合信息系统springspringMVCmybatis框架对象(javaBean,pojo)设计 驾校综合信息系…

无标签数据增强+高效注意力GAN:基于CARLA的夜间车辆检测精度跃升

目录 一、摘要 二、引言 三、框架 四、方法 生成合成夜间数据 昼夜图像风格转换 针对夜间图像的无标签数据增强技术 五、Coovally AI模型训练与应用平台 六、实验 数据 图像风格转换 夜间车辆检测和分类 结论 论文题目&#xff1a;ENHANCING NIGHTTIME VEHICLE D…

RocketMQ面试题:原理部分

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

NAFNet:Simple Baselines for Image Restoration

Abstract 近年来&#xff0c;图像复原技术取得了长足的进步&#xff0c;但现有的图像复原方法&#xff08;SOTA&#xff09;系统复杂度也在不断增加&#xff0c;不利于对各种方法的分析和比较。在本文中&#xff0c;我们提出了一种简单的基线&#xff0c;它超越了SOTA方法&…

FlinkCDC3.3 使用 Mysql 8.4 报错

一、报错日志 Caused by: io.debezium.DebeziumException: org.apache.flink.util.FlinkRuntimeException: Cannot read the binlog filename and position via SHOW MASTER STATUS. Make sure your server is correctly configuredat org.apache.flink.cdc.connectors.mysql.…

汽车一键启动按钮更换注意事项

汽车一键启动开关更换教程 一键启动开关是现代汽车中常见的便捷配置&#xff0c;但随着时间的推移&#xff0c;这个部件可能会出现失灵的情况。当一键启动开关发生故障时&#xff0c;许多车主选择自行更换。以下是整理的一键启动开关更换教程&#xff1a; 更换前的准备 选择匹…

接入DeepSeek,九牧开启AI卫浴新赛道!

2025年或可被称为AI新纪元元年&#xff0c;“具身智能”“智能机器人”“6G”等新词语出现在《政府工作报告》里&#xff0c;国家对制造业转型和“人工智能”的发展提出殷切期望。 近年来&#xff0c;围绕数智化&#xff0c;制造业开启了一场全球竞赛&#xff0c;在无人机、高…