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

LeetCode 分类刷题:611. 有效三角形的个数

题目

给定一个包含非负整数的数组 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 可以知道,对于三元组 (2,3,4) 和 (4,3,2),我们只统计了其中的 (2,3,4),并没有把 (4,3,2) 也统计到答案中,所以题目意思是把这两个三元组当成是同一个三元组,我们不能重复统计。

既然有这样的规则,那么不妨规定三角形的三条边 a,b,c 满足:1 ≤ a ≤ b ≤c
这可以保证我们在统计合法三元组 (a,b,c) 的个数时,不会把 (c,b,a) 这样的三元组也统计进去。

那么问题变成,从 nums 中选三个数,满足 1≤a≤b≤c 且 a+b>c 的方案数。

采用方法:枚举最长边 + 相向双指针

为了能够使用相向双指针,先对数组从小到大排序。 外层循环枚举最长边 c=nums[k],内层循环用相向双指针枚举 a=nums[i] 和 b=nums[j],具体如下:

  1. 初始化左右指针 i=0, j=k−1。
  2. 如果 nums[i]+nums[j]>c,由于数组是有序的,nums[j] 与下标 i' 在 [i,j−1] 中的任何 nums[i'] 相加,都是 >c 的,因此直接找到了 j−i 个合法方案,加到答案中,然后将 j 减一。
  3. 如果 nums[i]+nums[j]≤c,由于数组是有序的,nums[i] 与下标 j' 在 [i+1,j] 中的任何 nums[j'] 相加,都是 ≤c 的,因此后面无需考虑 nums[i],将 i 加一。
  4. 重复上述过程直到 i≥j 为止。

与 LeetCode Hot 100:15. 三数之和-CSDN博客 类似,

在设立相向双指针之前,有两个优化:

作者:灵茶山艾府
链接:https://leetcode.cn/problems/valid-triangle-number/solutions/2432875/zhuan-huan-cheng-abcyong-xiang-xiang-shu-1ex3/
来源:力扣(LeetCode)

答案

/*** @param {number[]} nums* @return {number}*/
var triangleNumber = function(nums) {nums.sort((a, b) => a - b);let ans = 0;for(let k = nums.length - 1; k > 1; k--) {    //倒序枚举if(nums[0] + nums[1] > nums[k]) {    //最小两数之和都大于最大数(边)ans += (k+1) * k * (k-1) / 6;    //任选三条边都可以构成一个三角形break;}if(nums[k-2] + nums[k-1] <= nums[k]) continue;    //次大两数之和都小于最大数let i = 0, j = k - 1;while(i < j) {if(nums[i] + nums[j] > nums[k]) {    //从nums[i]到nums[j-1]都可以作为最短边ans += j - i;j--;    //找新的第二短边} else {i++;    //找新的最短边}}}return ans;
};

复杂度分析

时间复杂度:O(n^2),其中 n 为 nums 的长度。

空间复杂度:O(1)。不计入排序的栈开销,仅用到若干额外变量。

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

相关文章:

  • 阿里云 Flink
  • 稀土新贵醋酸镥:高纯度材料的科技密码
  • 机器人定位装配的精度革命:迁移科技如何重塑工业生产价值
  • [特殊字符]企业游学 | 探秘字节,解锁AI科技新密码
  • 智慧养老破局:科技如何让“老有所养”变成“老有优养”?
  • 加载量化模型
  • 7.3 I/O方式 (答案见原书 P315)
  • HashMap 与 ConcurrentHashMap 深度解析
  • Java Stream (二)
  • 【模电笔记】—— 直流稳压电源——稳压电路
  • 从“T+1”到“T+0”:基于SQL构建MES到数据仓库的数据采集通道
  • 嵌入式学习---在 Linux 下的 C 语言学习 Day9
  • 时隔六年!OpenAI 首发 GPT-OSS 120B / 20B 开源模型:性能、安全与授权细节全解
  • PDW分选如何展示到界面上
  • MCU控制ADAU1701,用System Workbench for STM32导入工程
  • 力扣137:只出现一次的数字Ⅱ
  • 周志华院士西瓜书实战(二)MLP+SVM+贝叶斯分类器+决策树+集成学习
  • 一周学会Matplotlib3 Python 数据可视化-图形的组成部分
  • 1.1.3 本专栏内容介绍
  • 气象可视化网站整理:探索天气数据的视觉呈现
  • CRMEB会员电商系统集群部署 + 腾讯云日志托管优化方案
  • 实名认证 —— 腾讯云驾驶证识别接口
  • 云市场周报 (2025.08.06):腾讯云开学季、阿里云OSS降价及市场格局分析
  • Spring文件泄露与修复方案总结
  • C语言零基础第12讲:各类指针变量介绍与转移表应用
  • 基于Github Pages搭建个人博客站点:hexo环境搭建、本地预览与发布
  • 11、系统配置System文件夹
  • Docker 数据存储路径(解决默认docker路径位置磁盘空间不足的情况)
  • React(二):jsx事件绑定、条件渲染、列表渲染、jsx的本质、购物车案例
  • 玳瑁的嵌入式日记D13-0806(C语言)