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

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

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

🔥 个人专栏: 《数据结构》《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();//固定一个最大的数字作为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;}
};

和为s的两个数字
题目解析:
输入一个递增排序的数组和一个数字s,也就是说数组中的数字是有序的,将数组中相加等于s的两个数字组合输出即可
算法原理:
解法一:暴力解法
暴力枚举策略:将数组中的所有组合都枚举出来,用两层for循环,伪代码展示:
for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) 这样做的不好处就是时间复杂度会上升,
解法二:利用单调性,使用双指针算法解决问题
将left放置在索引为0的位置,right放置在n-1的位置,这里给一个详细的例子数组[ 2 7 11 15 19 21 ],target为30,首先left是指向2的位置,right放置在21的位置,此时left+right,sum值小于target,最小的数字和最大的数字相加都小于target,那么就说明这个最小的数字跟其他数字相加也会小于target,利用单调性的知识我们可以明白,此时就是说left太小了,所以需要left++,换一个更大一点的数字进行相加的对比;所以将left指向7的位置,right指向21,相加还是小于target,接着让left指向11,让right指向21,相加此时发现大于target,也就是说此时的right太大了,让right–到下一个位置;此时left等于11,right=19,相加等于target,符合要求,返回即可。

下面我们就将思路转换为代码写出OJ题;

http://www.dtcms.com/a/455642.html

相关文章:

  • 南皮网站建设公司快速排名优化怎么样
  • 深圳网站制作公司在那上海城乡建设网站证件查询
  • 网站风格分类有哪些营销网站做的好的公司
  • 开源网站建设是什么工作国内重大新闻事件摘抄
  • 贵阳网站制作建设网站属于什么费用吗
  • 西安做网站找腾帆英文网站建设方案 PPT
  • 代码错误网站深圳工程建设交易服务中心网站
  • 黄岩网站制作主流网站建设
  • 网站编辑seo网页制作基础代码
  • 网站用户管理系统道路运输电子证照
  • 营销网站的例子九江网络营销
  • 阿里巴巴网站建设要多少钱软文拟发布的平台与板块
  • 盘锦威旺做网站建设资讯门户网站 dede
  • 海南州公司网站建设一键logo设计官网
  • 汕头网站建设套餐宜昌seo优化服务
  • 【操作系统】线程理解 +POSIX线程库 + 线程互斥 + 可重入VS线程安全
  • 网站域名免费沈阳建信建设工程有限公司
  • dw网站开发流程网站上的充值链接怎么做
  • 佛山网站设计案例电商平台官方网站
  • seo怎么给网站做外链计算机类17个专业
  • 重庆专业网站营销重庆 网站定制
  • 网站开发技术的发展流程策划案格式模板
  • 搭建网站 赚钱口碑营销
  • 企业网站备案名称窍门天津建设银行东丽网站
  • 高端网站配色苏华建设集团网站
  • 网站名称设置wordpress移动端禁止放大
  • 墟沟企业建站价格表wordpress开发门户网站
  • 外资公司注册代理seo排名赚
  • 网站模板 哪家好python做互金网站
  • 云南网站建设肖庆华十大搜索引擎排行榜