【C++算法】6.双指针_有效三角形的个数

news2024/11/18 21:34:22

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解:


题目链接:

611.有效三角形的个数


题目描述:

8fae7351848e834f705d9f3eb07c33a0


解法

数学知识:

给我们3个数,判断是否能够构成三角形。

平时:a+b>c,a+c>b,b+c>a(判断三次)

如果已知3个数的大小 ,我们可以只判断较小的两个数之和是否大于第三个数。(判断一次)

我们可以先对整个数组排序。

解法一(暴力求解)

三层 for 循环枚举出所有的三元组,并且判断是否能构成三角形。

如果能构成三角形,需要满足任意两边之和要大于第三边。但是实际上只需让较小的两条边之和大于第三边即可。

经过我们的优化后,暴力枚举法的时间复杂度从3n3变成了nlogn+n3

解法二(排序 + 双指针)

排完序后,数组就有序了。我们就可以利用单调性使用双指针算法来解决问题。

6cae50b50e6bd8520765e4f472789f80

比如如果a,b,c取如图的位置。a+b>c,那么left往后移动,得到的结果都可以组成三角形。

177655d6549d09137ea77aebc914b10a

如果a,b,c取如图的位置。a+b<=c,那么无论left往后移动多少,得到的结果都不可以组成三角形。

87ad3b76f1556ab6b0ddeec6d4779c5c

步骤:

  1. 先固定最大的数(固定n次)
  2. 在最大的数的左区间内,使用双指针算法 ,快速统计出符合要求的三元组的个数。
  3. 然后更换固定的最大的数 ,依次类推。

C++ 算法代码:

解法一(暴力求解)(会超时)O(nlogn+n3)

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        // 1. 排序
        sort(nums.begin(), nums.end());
        int n = nums.size(), ret = 0;
        // 2. 从小到大枚举所有的三元组
        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(n2)

class Solution 
{
public:
    int triangleNumber(vector<int>& nums) 
    {
        // 1. 优化,排序一下数组
        sort(nums.begin(), nums.end());
        // 2. 利用双指针解决问题
        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;
                    right--;
                }
                else{
                    left++;
                }
            }
        }
        return ret;
    }
};

图解:

nums=[2,2,3,4]

  1. 优化,排序一下数组,原数组已经顺序了,所以没有变化。

  2. 进入第一层循环,i=3,left=0,right=2

    nums[0] + nums[2] > nums[3]

    ret=ret + right - left=2

    right--,right=1

  3. i=3,left=0,right=1

    nums[0] + nums[1] = nums[3]

    left++,left=1

    跳出while循环,i--

  4. i=2,left=0,right=1

    nums[0] + nums[1] > nums[2]

    ret=ret + right - left=3

    right--,right=0

    跳出while循环,i--

  5. i=1跳出外层for循环

  6. ret=3

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL数据库与PostGIS在Windows中的部署与运行

本文介绍在Windows电脑中&#xff0c;下载、安装、部署并运行PostgreSQL与PostGIS数据库服务的方法。 PostgreSQL是一种功能强大的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其稳定性、可靠性和丰富的功能而闻名&#xff1b;其支持多种高级特性&…

Linux命令一文速通速成

目录 嵌入式Linux的组成 Linux的介绍 Linux和发行版本 Linux应用 Linux特点 Linux发行版 GNU Linux目录结构 为什么要使用Linux命令&#xff1f; 登录 ​编辑 说明 shell是什么&#xff1f; bash shell Linux命令格式 命令格式举例 命令中的其他组成 Linux系统…

一文上手SpringSecurity【一】

一、概述 1.1 安全框架概述 作为企业级应用&#xff0c;都存在着各式各样的认证&#xff08;用户基本信息认证、第三方认证、LDAP认证&#xff09;与权限&#xff08;访问权限、数据权限&#xff09;需求&#xff0c;他们作为系统整体架构的基础建设部分&#xff0c;决定了产…

[通信原理]确知信号1:傅里叶分析 × 确知信号

傅里叶分析 对于周期函数可以用直流分量、正弦函数和余弦函数构成的无穷级数来表示&#xff0c;这些函数是正交的&#xff0c;意味着它们之间没有任何相关性。‌ 必须指出&#xff0c;并非任意周期信号都能进行傅里叶级数展开&#xff0c;函数需满足狄利赫里条件才能被展开。…

npj Climate and Atmospheric Science I 新疆生地所陈亚宁研究员团队孙帆博士后发表最新研究进展

题目&#xff1a;The dominant warming season shifted from winter to spring in the arid region of Northwest China 主导中国西北干旱区升温的季节已从冬季转变为春季 期刊&#xff1a;npj Climate and Atmospheric Science IF及分区&#xff1a;实时IF/JCR分区/中科院分…

土耳其阿纳多卢通讯社 (土耳其官方通讯社AnadoluAgency)发布新闻稿-新闻媒体分发平台

土耳其阿纳多卢通讯社 &#xff08;土耳其官方通讯社AnadoluAgency&#xff09;发布新闻稿-分发 大舍传媒 土耳其阿纳多卢通讯社&#xff08;Anadolu Agency&#xff09;创建于1920年&#xff0c;是土耳其的主要通讯社之一。它不仅在国家层面上发挥重要作用&#xff0c;还通过…

React学习笔记(2.0)

React事件绑定 语法&#xff1a;在对应标签上书写on事件&#xff08;比如onClick,onChange&#xff09;&#xff0c;注意和原生的事件区分&#xff0c;React的事件首字母要大写。 const handleChange(e:any)>{console.log(e);console.log(change事件触发);// e不是原生事件…

2、Spring Boot 3.x 集成 Feign

一、前言 本篇主要是围绕着两个点&#xff0c;1、集成 Feign&#xff0c;2、分离feign接口层&#xff0c;独立服务&#xff1b; 还有一点就是上篇文章的服务 iot-channel、system-server 服务名称调整成为了 chain-iot-channel、chain-system二、搭建 chain-common 服务 pom.…

推荐5款ai论文写作常用软件分享!轻松一键生成

在当前的学术研究和写作领域&#xff0c;AI论文写作工具的应用越来越广泛。这些工具不仅能够提高写作效率&#xff0c;还能帮助研究人员快速生成高质量的论文内容。以下是五款值得推荐的AI论文写作软件&#xff0c;它们可以帮助你轻松一键生成高质量的论文初稿。 一、千笔-AIP…

【IEEE PDF eXpress】格式不对

目录 一、问题二、解决方法 一、问题 word的文档&#xff0c;用IEEE PDF eXpress网站生成pdf后&#xff0c;提交论文出现错误&#xff1a; Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…

猫咪掉毛太严重,有什么好办法?不踩雷宠物空气净化器选购、测评指南

我家是勤梳毛空气净化器吸猫毛&#xff0c;我家三只猫&#xff0c;但来我家的朋友都说是感受不到我家有猫的。进门没毛、没味的&#xff0c;你可以试试。 现在到换毛季了&#xff0c;掉毛情况会更加严重&#xff0c;为了自己的呼吸道健康&#xff0c;千万要重视起来。 猫身上…

具身智能综述:鹏城实验室中大调研近400篇文献,深度解析具身智能

具身智能是实现通用人工智能的必经之路&#xff0c;其核心是通过智能体与数字空间和物理世界的交互来完成复杂任务。近年来&#xff0c;多模态大模型和机器人技术得到了长足发展&#xff0c;具身智能成为全球科技和产业竞争的新焦点。然而&#xff0c;目前缺少一篇能够全面解析…

Redis-常见数据类型(修改ing)

1. 预备知识 redis按照键值对的方式存储数据 1.1 基本全局命令 KEYS 返回所有满⾜样式&#xff08;pattern&#xff09;的key,⽀持如下统配样式: h?llo 匹配hello,hallo,hxlloh*llo 匹配hllo,heeeelloh[ae]llo 只匹配hallo helloh[^e]llo 匹配除hello,heee..llo以外的h[a…

【笔记】数据结构12

文章目录 2013年408应用题41方法一方法二 看到的社区的一个知识总结&#xff0c;这里记录一下。 知识点汇总 2013年408应用题41 解决方法&#xff1a; 方法一 &#xff08;1&#xff09;算法思想 算法的策略是从前向后扫描数组元素&#xff0c;标记出一个可能成为主元素的元…

Learn OpenGL In Qt之炫酷进度条

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 公众号&#xff1a; C学习与探索 | 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; Learn OpenGL In Qt 文章目录 设计实现目录结构需要哪些类接口设计关键函数 实现效果Shader解析GLSL基本函数clampsmoothstep 实现分析效…

【Python】Beaker:轻量级缓存与会话管理的解决方案

Beaker 是一个简单、灵活的 Python 库&#xff0c;主要用于缓存管理和会话管理。作为一个开源项目&#xff0c;Beaker 提供了多种缓存存储后端&#xff0c;帮助开发者在应用中高效管理缓存数据&#xff0c;同时支持会话存储&#xff0c;适合 Web 应用中的用户状态管理。其轻量级…

WebAPI编程(第一天,第二天)

WebAPI编程&#xff08;第一天&#xff0c;第二天&#xff09; day01 - Web APIs1.1. Web API介绍1.1.1 API的概念1.1.2 Web API的概念1.1.3 API 和 Web API 总结 1.2. DOM 介绍1.2.1 什么是DOM1.2.2. DOM树 1.3. 获取元素1.3.1. 根据ID获取1.3.2. 根据标签名获取元素1.3.3. H5…

端侧多模态 | 不到10亿参数的端侧Agent竟媲美GPT-4V?AI手机不远了!

引言 简介 相关工作 模型 编码视觉信息 函数token 多阶段训练 模型评估 发送邮件 发送短信 Google搜索 Amazon购物 智能回收 失物招领 室内设计 Instacart购物 DoorDash(外卖平台)示例 动物护理 总结 引言 青山一道同云雨&#xff0c;明月何曾是两乡。 小伙…

王道-数据结构

1 设数组data[m]作为循环队列的存储空间,front为队头指针,rear为队尾指针,则执行出队操作后其头指针front值为____ 答案:D 解析:队列的头指针指向队首元素的实际位置,因此出队操作后,头指针需向上移动一个元素的位置。循环队列的容量为m,所以头指针front加1以后,需…

CVPR论文《DSVT: Dynamic Sparse Voxel Transformer with Rotated Sets》

1、整体思维导图 2、个人收获 这篇论文在理论上对于我来说可能就是让我大致了解了这个领域&#xff08;因为我的研究方向不是这方面&#xff09;&#xff0c;看完以后也没有看得特别懂&#xff08;说实话&#xff09;。 更多的收获应该是在论文的写作思路上吧 3、下面欣赏论…