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

★ 算法OJ题 ★ 力扣611 - 有效三角形的个数

Ciallo~(∠・ω< )⌒☆ ~ 今天,椎名日和将和大家一起做一道双指针算法题--有效三角形的个数~

目录

一  题目

二  算法解析

三  编写算法


一  题目

二  算法解析

给三个数,判断是否能构成三角形的条件:两个较小的数相加大于第三个数

解法⼀:暴力求解

算法思路:三层 for 循环枚举出所有的三元组,并且判断是否能构成三⻆形。(会超时)

此算法时间复杂度为 O(N^3)

若不使用上述原理,则每次需要判断3次,O(3(N^3)) 远大于 O(NlogN + N^3)

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;}
};

解法⼆:排序利用单调性 + 双指针

算法思路:

  • 先将数组排序
  • 根据解法⼀中的优化思想,我们可以固定最长边,然后在⽐这条边小的有序数组中找两个数,使这个两数之和⼤于这个最⻓边。由于数组是有序的,我们可以利⽤对撞指针来优化。

设最⻓边为C,区间 [left, right] 是 C 位置左边的区间:

  • nums[left] + nums[right] > C 
  • 说明 [left, right - 1] 区间上的所有元素加 nums[right] 都比 C 大
  • 满⾜条件的有 right - left
  • right 位置的元素的所有情况相当于全部考虑完毕, right--
  • nums[left] + nums[right] <= C
  • left 位置的元素是不可能与 [left + 1, right] 位置上的元素构成三角形
  • left++

上述循环完成后C--

三  编写算法

class Solution {
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(), nums.end()); // 排序int n = nums.size();int ret = 0; // 符合要求的个数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;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 004、架构_计算节点
  • 【精选】基于Hadoop的用户网站浏览分析的设计与实现(全网最新定制,独一无二)
  • 深入解析HarmonyOS Image组件的使用与优化
  • Java设计模式【解释器模式】-行为型
  • 记一次学习--webshell绕过
  • 什么是RS485总线?
  • Redis高级---面试总结之内存过期策略及其淘汰策略
  • 基于yolov8的人头计数检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • ctfhub-web-SSRF(FastCGI协议-DNS重绑定 Bypass)
  • Java算法之Gnome 排序
  • 基于web旅游信息平台的设计与实现
  • C语言习题~day38
  • Java项目: 基于SpringBoot+mysql图书个性化推荐系统分前后台 (含源码+数据库+答辩PPT+毕业论文)
  • mac nvm安装及使用(nvm安装指定版本node npm pnpm)
  • 「草莓」即将上线,OpenAI新旗舰大模型曝光,代号「猎户座」
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Android 架构优化~MVP 架构改造
  • Angular 2 DI - IoC DI - 1
  • DataBase in Android
  • express如何解决request entity too large问题
  • flask接收请求并推入栈
  • Java精华积累:初学者都应该搞懂的问题
  • React系列之 Redux 架构模式
  • vue2.0项目引入element-ui
  • vue自定义指令实现v-tap插件
  • 官方解决所有 npm 全局安装权限问题
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 排序算法之--选择排序
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • nb
  • # Redis 入门到精通(一)数据类型(4)
  • #includecmath
  • #大学#套接字
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (02)vite环境变量配置
  • (4)(4.6) Triducer
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (理论篇)httpmoudle和httphandler一览
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)插入排序
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ./configure,make,make install的作用
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 设计模式—适配器模式(Adapter Pattern)