跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

算法:双指针法求解有效三角形个数

给定非负整数数组,统计能组成三角形的三元组数量。通过排序将问题转化为双指针查找,利用三角不等式性质优化判断过程。固定最长边,在剩余区间内使用左右指针寻找满足两边之和大于第三边的组合,时间复杂度 O(n²)。

萤火微光发布于 2026/3/25更新于 2026/10/1679 浏览
算法:双指针法求解有效三角形个数

题目描述

给定一个包含非负整数的数组 nums,返回其中可以组成三角形三条边的三元组个数。

示例 1: 输入:nums = [2,2,3,4] 输出:3 解释:有效的组合是:(2,3,4)(使用第一个 2)、(2,3,4)(使用第二个 2)、(2,2,3)

示例 2: 输入:nums = [4,2,3,4] 输出:4

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000

解题思路

要判断三条边能否构成三角形,核心依据是三角不等式:任意两边之和大于第三边。对于三条边 $a, b, c$,需满足 $a+b>c$,$a+c>b$,且 $b+c>a$。

如果我们将数组先进行排序,假设选取的三条边为 $a \le b \le c$,那么只需验证 $a+b>c$ 即可。因为 $c$ 是最大的边,$a+c>b$ 和 $b+c>a$ 必然成立。这一性质大大简化了判断逻辑。

基于这个性质,我们可以采用'排序 + 双指针'的策略来降低时间复杂度,避免暴力枚举带来的 $O(N^3)$ 开销。

具体做法是固定最长边 nums[k],然后在 [0, k-1] 范围内寻找满足条件的两个较短边。设左指针 left 指向起始位置,右指针 right 指向 k-1。

若 nums[left] + nums[right] > nums[k],说明当前 nums[right] 与 nums[k] 搭配时,从 left 到 right-1 的所有元素都能与它们构成三角形(因为数组已排序,左侧元素更大)。此时符合条件的组合数为 right - left,随后将 right 左移继续尝试。

若和不满足条件,则说明 nums[left] 太小,无法与 nums[right] 配合超过 nums[k],只能将 left 右移增大数值。

遍历完所有可能的最长边后,累加计数即为结果。

代码实现

class Solution {
    public int triangleNumber(int[] nums) {
        int n = nums.length;
        // 先排序,确保 a <= b <= c 的顺序
        Arrays.sort(nums);
        int count = 0;
        
        // 固定最长边,从倒数第三个开始向前遍历
        for (int k = n - 1; k >= 2; k--) {
            int left = 0;
            int right = k - 1;
            while (left < right) {
                if (nums[left] + nums[right] > nums[k]) {
                    // 若满足条件,则 left 到 right-1 之间的所有数与 right, k 均构成三角形
                    count += right - left;
                    right--;
                } else {
                    // 不满足,left 太小,需要增大
                    left++;
                }
            }
        }
        return count;
    }
}

该解法的时间复杂度主要取决于排序和双指针遍历,整体为 $O(N^2)$,空间复杂度为 $O(1)$(不计排序栈开销),能够高效处理题目给定的数据规模。

目录

  1. 题目描述
  2. 解题思路
  3. 代码实现

更多推荐文章

查看全部
  • FileSaver.js 实战解析:前端文件下载通用方案
  • HTML 网页结构搭建:从语义化标签到整站规划
  • AirSim 无人机仿真入门:实现起飞与降落
  • YOLO11 驱动的无人机航拍小目标检测系统实战
  • 国内 20 家大厂大模型岗位面试经历与面经复盘
  • 电科金仓发布融合数据库 KES V9 2025 及 AI 产品体系
  • 前端蓝桥杯 Web 备考:AJAX 与 XMLHttpRequest 核心知识点及实战
  • STL vector 常用接口使用及底层原理与实现
  • B/S 架构详解:现代 Web 应用的核心架构模式
  • Axure 实现 AI 自动对话机器人原型教程
  • Windows 10/11 查看 MAC 地址的四种方法
  • Axum:Rust 高性能 Web 框架实战指南
  • PyCharm 安装通义灵码插件及功能使用指南
  • AstrBot+NapCat 一键部署智能 QQ 机器人及 cpolar 公网访问配置
  • Python pip 安装报错:Preparing metadata 失败的处理
  • Qwen-Image-2512 免费本地部署实战指南
  • 傅里叶变换:FFT 与 DFT 原理及算法详解
  • 数据结构:顺序表的原理与实现
  • 字节开源 DeerFlow 2.0:重构 Super Agent 运行时基础设施
  • Hydro 系统本地部署指南与 CSP/GESP 题库导入

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online