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

算法——双指针(day3)

611.有效三角形的个数

611. 有效三角形的个数 - 力扣(LeetCode) 

题目解析:

三角形的判定很简单,任意两边之和大于第三边即可。按照正常情况,我们得判断3次才可以确认是否构成三角形。

因为c在本来就是最大的情况下与任意一个数组合只会更大,因此不会再进行判断,这样在数组排序的情况下,我们仅需要判断一次即可~

算法解析:

在这种选择比较大小的组合中往往蕴含着单调性,只要我们找到并利用双指针就可以节省很多时间。

我们先固定最大的数(9)充当c,然后再分别选出两端的数充当a与b(差异大可以更好发现单调性)。当全部选好后无非就是两种结果:

  • a+b>c ——构成三角形
  • a+b<=c ——不构成三角形

重点来了~我们分别对这两种情况进行分析:

由于是升序排列,那么b(8)就没必要继续与>=a(2)的数进行对比了,直接把b(8)排除,然后往前一位继续对比。

a+b>c—— (有效三角形个数:b-a个,b--)

 

与上面同理,当我们发现有无法构成的情况时(2与7组合),2连与该范围最大的7都无法构成,更别提<=b(7)的数了,所以2这种情况也全部排除,然后前进一位继续对比。

a+b<=c——(a++) 

最后进行一轮比较完毕后,我们再移动最大数c进行第二轮的比较,以此类推即可。

代码:

class Solution {
public:int triangleNumber(vector<int>& nums) {int n = nums.size();//优化排序sort(nums.begin(), nums.end());int c = n - 1;int sum = 0;//固定最大数while (c >= 2){int a = 0;int b = c - 1;//一轮比较while (a < b){if (nums[a] + nums[b] > nums[c]){//计数sum += (b - a);b--;}else{a++;}}//更换最大数c--;}return sum;}
};

179. 查找总价格为目标值的两个商品


题目解析:

这道题相信如果大家有看我们611的题解就会发现很熟悉了,同样的升序,同样的比较大小。用单调性和双指针kuku造就完事了~

算法解析:

最后判断表达式为:

  • left+right>t —— right--
  • left+right<t —— left++
  • left+right==t —— 返回下标

代码:

class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int n = price.size();int left = 0;int right = n-1;while(left<right){if(price[left]+price[right]>target){right--;}else if(price[left]+price[right]<target){left++;}else{return {price[left],price[right]};}}return {-1,-1};}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 记一下blender的烘焙贴图的UV特殊用法
  • HouseCrafter:平面草稿至3D室内场景的革新之旅
  • 数学基础【俗说矩阵】:矩阵相乘
  • redhat 7服务管理
  • 科普文:TaobaoVM信息收集
  • 算法 —— 快速幂
  • mac docker no space left on device
  • 计算机网络——网络层(路由选择协议、路由器工作原理、IP多播、虚拟专用网和网络地址转换)
  • 数据库连接的艺术:在PyCharm中轻松配置
  • 【Python】Selenium怎么切换浏览器的页面
  • 关于Flutter的build
  • python gradio 的输出展示组件
  • 中介者模式(行为型)
  • 【JVM】JVM调优练习-随笔
  • 从C向C++20——C++11(1)
  • 《剑指offer》分解让复杂问题更简单
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 2017届校招提前批面试回顾
  • 2018一半小结一波
  • Android 控件背景颜色处理
  • C++类中的特殊成员函数
  • Git的一些常用操作
  • gops —— Go 程序诊断分析工具
  • Java编程基础24——递归练习
  • webpack入门学习手记(二)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 规范化安全开发 KOA 手脚架
  • 机器学习 vs. 深度学习
  • 记录:CentOS7.2配置LNMP环境记录
  • 免费小说阅读小程序
  • 如何使用 JavaScript 解析 URL
  • 用element的upload组件实现多图片上传和压缩
  • 优秀架构师必须掌握的架构思维
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​第20课 在Android Native开发中加入新的C++类
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • (55)MOS管专题--->(10)MOS管的封装
  • (超详细)语音信号处理之特征提取
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (七)Java对象在Hibernate持久化层的状态
  • (算法)硬币问题
  • (一)为什么要选择C++
  • ***详解账号泄露:全球约1亿用户已泄露
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net Application的目录
  • .NET Core 中的路径问题
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .net中应用SQL缓存(实例使用)
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [1]-基于图搜索的路径规划基础
  • [18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪