双指针算法专题之——有效三角形的个数

文章目录

  • 题目介绍
  • 思路分析
  • AC代码

题目介绍

链接: 611. 有效三角形的个数

在这里插入图片描述

思路分析

如果判断三个数能否构成一个三角形,相信大家都知道:

只要任意两边之和大于第三边即可。
比如三条边长度为a,b,c
那只要满足
a+b>c
a+c>b
b+c>a

但是,这样要判断三个条件,我们来介绍另一种方法:

如果三条边的长短已经知道:a<=b<=c
那么此时只需满足较短的两条边之和大于最长的那条边,即
a+b>c
那么它们就一定能构成一个三角形,另外两个条件就不需要判断了
原理很简单,因为c是最大的,c+一个数一定比另外两条边还大。

那题目呢,是给定一个包含非负整数的数组 nums ,要返回其中可以组成三角形三条边的三元组个数。

所以,判断的时候,我们可以先给数组排个序(升序)

然后呢,我们就可以用双指针来解决这道题,具体怎么做呢?我们来看一个例子:

给这样一个数组
在这里插入图片描述
最大值是10,所以我们先让固定c为10
那a,b呢?
在这里插入图片描述
一个指向剩余区间的最大值,一个指向最小值
然后判断,此时的a+b=11,当然大于10(第一种情况:a+b>c),所以当前这一组是满足的,可以构成三角形。
然后我们观察,此时a是最小的,所以此时ab之间的数据都是>=a的,所以中间的这些数据和b相加一定都大于此时的c。
在这里插入图片描述
一共种呢,就是b的下标-c的下标
在这里插入图片描述
当前情况下就是5-0=5种。
所以中间的情况就不用判断了。b=9时一共5种情况可行。
假设两个指针left和right分别指向ab,那接下来只需让right--即可,判断c=10,b=5时候的情况
在这里插入图片描述
此时a+b<c(第二种情况:a+b<=c
所以构不成三角形,并且,可以断定此时a和ab之间的数都相加都不大于c,因为这些数都比此时的b(5)小
在这里插入图片描述
所以固定c为10的情况下,a=2时,跟2 3 4 5都不行(9已经判断过了)
所以此时让left++,看后面的行不行(后面的数一定>=2,因为已经排序)
后序也是如此进行判断。
这一轮结束后(当left>=right结束),固定c为10的情况就计算完了,只需让c指向9,right从c的前面开始,left还从0下标开始,进重复上述操作,行下一轮的判断即可。

总结一下:

  1. 先固定c为最大的数
  2. 定义双指针,按照上述逻辑,判断出当前情况下符合条件的三元组个数。
    如果a+b>c,b前面的元素个数就是b为当前值的情况下符合条件的三元组个数,然后b往前移(right- -);
    如果a+b<=c,说明a为当前值的情况下找不到满足条件的,让a往后移(left++),再重新判断
  3. 固定c为次大的数,重复上述操作,当c前面的数小于2个,就结束了(即c的下标<2)

AC代码

在这里插入图片描述
在这里插入图片描述

class Solution {
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(),nums.end());int index_c=nums.size()-1;//c的下标int count=0;while(index_c>=2)//index_c<2,此时左边的数就不够两个了{int left=0;//标识a的位置int right=index_c-1;//b的位置while(left<right){if((nums[left]+nums[right])>nums[index_c])      {count+=(right-left);--right;}else++left;}--index_c;}return count;}
};

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

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

相关文章

Linux内核实时机制27 - RT调度器10 - RT throttling 带宽控制下

文章目录 1、初始化带宽 init_rt_bandwidth1.1、init_rt_bandwidth2、定时器处理2.1、sched_rt_period_timer2.2、do_sched_rt_period_timer3、总结1、初始化带宽 init_rt_bandwidth rt_runtime : 一个时间周期内的运行时间,超过则限流,默认值为0.95ms 1、init_rt_bandwidth…

1.5[hardware][day5]

Link类跳转指令可以拆分为两个部分&#xff0c;一个是跳转&#xff0c;即下一个PC的生成&#xff0c;如果将分支条件的比较放到译码级来进行&#xff0c;则这部分只涉及取值级和译码级流水&#xff1b;另一个是Link操作&#xff0c;简单来说就是写寄存器&#xff0c;这部则主要…

Tomcat 与 Java 环境变量配置简明教程

Tomcat 与 Java 环境变量配置简明教程 一、Tomcat 环境变量配置 1. 确认安装路径 假设 Tomcat 安装在&#xff1a;D:\Tomcat\apache-tomcat-9.0.70 2. 设置 CATALINA_HOME 步骤&#xff1a; 右键点击「此电脑」→「属性」点击「高级系统设置」→「环境变量」在「系统变量…

3.16学习总结

学习了Java的知识点 基本数据类型 byte占1字节&#xff0c;储存范围-128~127 short占2字节&#xff0c;储存范围-32768~32767 int占4字节&#xff0c;储存范围-2147483648~2147483647 long占8字节&#xff0c;储存范围是-9223372036854775808~9223372036854775807 float占…

Android手机中各类安全相关知识总结

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Android 安全威胁2. Android 安全防护措施3. Android 安全建议和最佳实践4. Android 安全工具推荐5. Android 安全常见问题5.1 如何检测设备是否感染恶意软件?5.2 如何防止应用滥用权限?5.3 如何保护设备免受网络攻…

【Ratis】项目总览

Apache Ratis 项目源码分析与运行原理 Apache Ratis 是一个高性能、可扩展的分布式一致性协议实现,是对Raft协议的Java版本的很好的工程实现。它提供了灵活的 API 和多种传输层支持(如 gRPC 和 Netty),适用于构建分布式系统中的核心组件,例如分布式存储、配置管理和服务发…

以太网 MAC 帧格式

文章目录 以太网 MAC 帧格式以太网帧间隔参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记&#xff0c;文末均附有参考链接&#xff0c;如侵权&#xff0c;请联系删除。 以太网 MAC 帧格式 以太网技术的正式标准是 IEEE 802.3&#xff0c;它规定了以太网传输数据的帧结…

pycharm配置镜像源【pycharm最新版(23.2.5及以上)方法】

经常遇到pycharm中无法安装或者安装慢的问题&#xff0c;纠结了好久&#xff0c;终于找到这个解决办法了。 为什么要配置镜像源&#xff1a; 因为Python的包管理工具pip一般从PyPI&#xff08;Python Package Index&#xff09;下载安装包&#xff0c;但是PyPI位于国外&#x…

驾驭 DeepSeek 科技之翼,翱翔现代学习新天际

在当今这个信息爆炸的时代&#xff0c;学习的方式和途径正在经历着前所未有的变革。人工智能技术的飞速发展&#xff0c;为我们的学习带来了全新的机遇和挑战。DeepSeek 作为一款强大的大语言模型&#xff0c;凭借其卓越的性能和丰富的功能&#xff0c;为现代学习注入了新的活力…

科普:WOE编码与One-Hot编码

WOE编码是业务逻辑与统计建模的结合&#xff0c;适合强业务导向的场景&#xff1b; One-Hot编码是数据驱动的特征工程&#xff0c;适合追求模型性能的场景。 编码方式核心价值典型案例WOE编码保留变量预测能力&#xff0c;适配线性模型银行违约预测逻辑回归One-Hot编码释放特征…

Python----数据分析(Pandas一:pandas库介绍,pandas操作文件读取和保存)

一、Pandas库 1.1、概念 Pandas是一个开源的、用于数据处理和分析的Python库&#xff0c;特别适合处理表格类数 据。它建立在NumPy数组之上&#xff0c;提供了高效的数据结构和数据分析工具&#xff0c;使得数据操作变得更加简单、便捷和高效。 Pandas 的目标是成为 Python 数据…

Type-C:智能家居的电力革命与空间美学重构

在万物互联的时代浪潮中&#xff0c;家居空间正经历着从功能容器到智慧终端的蜕变。当意大利设计师安东尼奥奇特里奥提出"消失的设计"理念二十年后&#xff0c;Type-C充电技术正以润物无声的方式重塑着现代家居的形态与内核&#xff0c;开启了一场静默的居住革命。 【…

C++ 左值(lvalue)和右值(rvalue)

在 C 中&#xff0c;左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是指对象的不同类别&#xff0c;区分它们对于理解 C 中的表达式求值和资源管理非常重要&#xff0c;尤其在现代 C 中涉及到移动语义&#xff08;Move Semantics&#xff09;和完美转…

【含文档+PPT+源码】基于SpringBoot和Vue的编程学习系统

项目介绍 本课程演示的是一款 基于SpringBoot和Vue的编程学习系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项…

关于新奇的css

background: linear-gradient(154deg, #07070915 30%, hsl(var(--primary) / 30%) 48%, #07070915 64%); filter: blur(100px); background: linear-gradient(154deg, #07070915 30%, hsl(var(--primary) / 30%) 48%, #07070915 64%); 这是一个线性渐变背景设置&#xff0c;角度…

Maxscript如何通过单击现有按钮添加新按钮?

创建一个按钮,你可以单击它,然后添加一个新按钮。 你必须创建一个动态UI,使用maxscript UI元素,将卷展栏构建为字符串,然后评估该字符串并打开新的卷展栏以更新你的UI;使用RolloutCreator(请参阅帮助文件)帮助您构建卷展栏,并打开新的卷展栏以更新您的UI,看下面的示…

Android控件Selector封装优化指南:高效实现动态UI效果

本文详细介绍了如何在Android开发中优化selector的封装&#xff0c;涵盖Button、TextView、ImageView、CheckBox、RadioButton等常见控件的动态效果实现。通过结合Material Design组件、矢量图、Ripple效果以及动画Selector&#xff0c;提供了一套现代化、高性能的解决方案&…

pytest+allure+jenkins

本地运行参考&#xff1a;pytestallure 入门-CSDN博客 jenkins运行如下&#xff1a; 安装插件&#xff1a;allure 配置allure安装目录 配置pytest、allure 环境变量 配置流水线 进行build,结果如下 ,点击allure report 查看结果

C#核心笔记——(五)框架概述

.NET Ftamework中几乎所有功能都是通过大量的托管类型提供的。这些类型组织在层次化的命名空间中&#xff0c;并打包为一套程序集&#xff0c;与CLR一起构成了.NET平台。 有些.NET类型是由CLR直接使用的&#xff0c;且对于托管宿主环境而言是必不可少的。这些类型位于一个名为…

phpstudy+phpstorm+xdebug【学习笔记】

配置PHPStudy 配置PHPSTORM phpstorm选择PHP版本 配置DEBUG 设置服务器 编辑配置 学习参考链接&#xff1a;&#xff1a;https://blog.csdn.net/m0_60571842/article/details/133246064