当前位置: 首页 > news >正文

算法入门:专题攻克一---双指针(3)有效三角形的个数

🎬 胖咕噜的稞达鸭:个人主页

🔥 个人专栏: 《数据结构》《C++初阶高阶》《算法入门》

⛺️技术的杠杆,撬动整个世界!

有效三角形的个数

有效三角形的个数
在这里插入图片描述
题目解析:

数组中随意挑出三个数字,挑出所有可以组成三角形的组合,最终仅仅需要返回所有三元组的个数即可。

算法原理:

三角形的组成:两边之和大于第三边,两边之差小于第三边。那如果按照这种规则拿出所有的组合,再将所有组合进行判断,这个时间复杂度可能会很大,那么要减少时间的消耗,就需要先对三个数字进行排序,只需要较小的两个数字相加大于第三个数字就满足构成三角形的条件了。

优化先对整个数组进行排序

解法一:暴力解法,三层枚举

解法二:排序之后,利用单调性,使用双指针算法来解决问题。先来固定最大的数字,这里给一个数组我们好理解,[ 2, 2, 3, 4, 5, 9, 10],先固定第三边c=10,然后将定义两个指针,left先从索引为0的元素开始,假设left所在的数字数值为a,right是C之前的索引为n-2的元素,指向第二大的元素,right所在的数字数值为b,如果最小的元素数值跟第二大的元素数值相加大于最大的数值,那么此时2之后的元素跟9相加都会大于10,此时有right-left组可以构成a+b>c的三角形组合。
接下来将right--,向前挪动一位,如果a+b都是小于等于c的,找不到结果,然后left++,接着重复我们上面的操作,

解法总结:

1.先固定最大的数;
2.在最大的数的区间中,使用双指针算法,快速统计出符合要求的三元组的个数;

接下来我们将思路转化成代码:
先对整个数组 进行排序,sort(nums.begin(),nums.end());
整个题目最后让我们统计出符合条件的三元组的个数,所以定义一个ret来存储符合条件的三元组的个数,最后返回ret即可;
接着需要利用双指针来统计符合元素的三元组,在此之前需要有一个数组中大的数字充当c,但是这个C不是固定的,让c从数组最后一个元素向前遍历到索引为2的数字,for(int i=n-1;i>=2;i--)
接着让left指针向后遍历,right向前遍历,

  • a+b>c: 如果left指向的位置的数字加上right指向的位置的数字大于c,那么从left所在位置直到right所在位置之前这一段区间的数字加上right都大于c,都满足三元组的条件,ret+=right-left,right–;
  • a+b<=c:left指向位置的数字加right指向位置的数字小于c,说明left太小了,left++;继续进行判断。最终left>=right时结束循环。
class Solution {
public:int triangleNumber(vector<int>& nums) {//1.优化sort(nums.begin(),nums.end());//2.利用双指针解决算法问题int ret=0;//统计三元组int n=nums.size()-1;//固定一个最大的数字作为cfor(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;}
};
http://www.dtcms.com/a/453524.html

相关文章:

  • 怎么做才能提高网站权重360建筑网证书估价
  • IPTV Pro 9.1.9| 空壳直播软件,可导入直播源
  • 【高级】系统架构师 | 2025年上半年案例分析真题DAY1
  • 图片上传网站变形的处理新浪微博登录网页版
  • OpenCV(二):加载图片
  • 免费的网站推广怎么做效果好服务营销策划方案
  • 【征文计划】Rokid 语音唤醒技术深度解析:从声学模型到低功耗优化实践
  • Linux---进程信号
  • 从汽车传动到航空航天:滚珠花键的跨领域精密革命
  • 电子电气架构 --- 汽车座舱市场发展核心方向
  • leetcode 69.x的平方根
  • 网站建设策划方案书论文免费seo诊断
  • 【密码学实战】openHiTLS keymgmt命令行:密钥管理工具
  • 网站上线倒计时html5模板企业培训机构有哪些
  • 中型规模生产架构部署详细步骤
  • 如何加强英文网站建设重庆网站建设的公司哪家好
  • 逆向分析文档:基于 app.endata.com.cn 票房数据接口的加密与解密流程
  • 为什么做腾讯网站如何压缩网站
  • 吴恩达机器学习课程(PyTorch适配)学习笔记:1.1 基础模型与数学原理
  • 【全志V821_FoxPi】6-1 MIPI协议与MIPI摄像头
  • 【防火墙源码】WordPress防火墙插件1.0测试版
  • 全国美容网站建设房源信息网
  • CentOS 7 环境下 MySQL 5.7 深度指南:从安装、配置到基础 SQL 操作
  • ⚡ arm 32位嵌入式 Linux 系统移植 NTP 服务
  • 抖音,小红书等自媒体平台多开账号如何操作不违规
  • [Java]PTA: jmu-Java-03面向对象基础-Object
  • 【大模型实战篇】基于xiaohongshu-mcp实现对话模式的小红书笔记操作
  • LangChain详解(一)
  • 门户网站建设需求wordpress云主机
  • 【OpenArm|Control】openarm机械臂ROS2仿真控制