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

【Leetcode高效算法】用双指针策略打破有效三角形的个数

前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君**耐其心性,忘却杂尘,道有所长!!!!

在这里插入图片描述


IF’Maxue:个人主页

 🔥 个人专栏:
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》

⛺️生活是默默的坚持,毅力是永久的享受。不破不立!

文章目录

  • 题目解析
    • 三角形的构成条件
    • 解法一:暴力枚举法(效率较低但直观)
    • 解法二:双指针算法(又快又巧妙)
      • 核心思路:
      • 具体操作
    • 代码咋写?

题目解析

在这里插入图片描述

题目链接:有效三角形的个数

咱们先来明确下问题:

  • 给一个非负整数的数组,咱们要找出其中能组成三角形的三个数有多少个?

  • 要是数组里有重复的元素,比如[2,2,2],这也算一个有效的三元组

三角形的构成条件

数学里说,三个数a、b、c要组成三角形,需要满足:

即两边之和大于第三边
  • 普通思路:分别判断三个边
        a + b > c
        a + c > b
        b + c > a

  • 高效思路:
    咱们先把这三个数排个序,比如让a ≤ b ≤ c。这时候你会发现:后面两个条件不用看了,只要满足a + b > c,这三个数就能组成三角形!

解法一:暴力枚举法(效率较低但直观)

    
最直接的思路是:遍历数组中所有可能的三元组,逐一验证其是否能构成三角形。

具体实现:使用三重循环,通过索引i、j、k枚举所有组合,检查每组三个数是否满足三角形不等式a + b > c。

for(i = 0; i < n; i++)for(j = i + 1; j < n; j++)for(k = j + 1; k < n; k++)check(i, j, k);

需要注意的是:

  • 当数组规模较大时(如n=1000),该算法的时间复杂度为O(n³),计算量会显著增加,因此在实际应用中效率较低。

解法二:双指针算法(又快又巧妙)

 
既然暴力法太慢,咱们换个思路。利用数组的单调性(排序后),用双指针来加速计算。

核心思路:

  1. 先给数组排个序(方便咱们用“a ≤ b ≤ c”的条件)
  2. 固定最大的数c(也就是下标为n的元素)
  3. 在c左边的区间里(也就是0到n-1),用两个指针left和right来找a和b,快速统计满足a + b > c的组合(对应双指针算法的图片)
    在这里插入图片描述

具体操作

  • 首先我们知道这是一个有序数组,我们用最小的和最大的相加
    • a+b>c 那么a后面的所有数与b相加>c,所以可以与c和b构成三角形的三元组个数为:right-left
    • a+b<=c 那么说明:这里的a无法与b和c构成三角形,所以我们将a往后移。
  • 这里用最大数10遍历完之后,然后用往前移动,用9当最大数。直到下标为2的时候。
    就这么一步步,把每个可能的最大数c都试一遍,直到n=2(因为至少要三个数才能组成三角形)。(对应双指针移动过程的图片)

代码咋写?

咱们直接看代码,结合上面的思路理解:

class Solution {
public:int triangleNumber(vector<int>& nums) {// 先给数组排序,方便用a ≤ b ≤ c的条件sort(nums.begin(), nums.end());int n = nums.size() - 1;  // 从最大的数开始当cint sum = 0;  // 统计总共有多少个有效三元组// 当n至少为2时才有可能组成三元组(因为需要三个数)while (n >= 2) {int left = 0;    // 左指针,找较小的aint right = n - 1;  // 右指针,找中间的b// 当left < right时,继续找a和bwhile (left < right) {// 如果a + b > c,说明left到right-1的a都满足条件if (nums[left] + nums[right] > nums[n]) {sum += right - left;  // 加上这些符合条件的数量right--;  // 让b小一点,再试试} else {// 如果a + b ≤ c,说明a太小了,换个大一点的aleft++;}}n--;  // 换一个小一点的c}return sum;}
};
http://www.dtcms.com/a/431760.html

相关文章:

  • 浏览器为什么打不开网站wordpress搭建多人博客
  • 牛客算法刷题noob57 凯撒加密
  • 计算机类毕业设计开题报告注意事项
  • Qt QML创建多线程(示例存读数据库)
  • 2026届计算机毕业设计选题推荐
  • 邹城市网站建设长春网站建设方案外包
  • 合肥建公司网站万户信息 做网站怎么样
  • 第十篇:告别new和delete:RAII机制与智能指针导论
  • 做搜狗pc网站优化快速深圳企业模板建站
  • 深度学习第十章 循环神经网络
  • 设计一个外贸网站需要多少钱wordpress 博客地址更改
  • ASP网站建设实训报告总结大德通众包做网站怎么样
  • 查询网站死链接温州百度快速排名优化
  • 网站建设全包哪家便宜怎么在网站上做按钮
  • 永州网站建设哪家好中信建设有限责任公司深圳中信金融中心项目工期专业招标
  • 八年级信息网站怎么做网站设计的价格
  • OSPF Init 状态 概念及题目
  • 事件相关电位(Event-Related Potential,ERP)
  • 运营一个网站的成本wordpress 网站小模块
  • 怀化市建设局网站地址wordpress建什么站
  • 网站域名解析怎么做wordpress筛选最新文章
  • 【知识科普】JSON数据格式详细介绍
  • wordpress站酷首页wordpress引用jquery
  • 深度学习中的池化(Pooling)技术:原理、实现与应用
  • 手机响应式网站建设公司做电商必须知道的网站
  • Linux任务上下文切换context_switch函数的实现
  • 移动网站开发教学大纲安装wordpress 000
  • 《小米 17:创新与争议并存的科技新品》
  • thinkphp怎么做网站壹六八信息科技网站建设
  • 网站建站企业wex5 后端实现全网站开发