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

好未来0520上机考试题2:有效三角形的个数

题目

(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. 固定最短边的位置i(从0到n-3),然后固定第二边j(从i+1到n-2),然后通过二分查找或双指针找到最大的k(j+1开始),使得nums[i] + nums[j] > nums[k]。注意:实际上,我们利用双指针技巧,因为当j增加时,满足条件的k值也会增加(因为数组有序,nums[j]增大,那么nums[i]+nums[j]也增大,所以之前满足的k现在依然满足,且k可以继续向后移动)。
  3. 对于每一对(i, j),我们找到满足条件的最大的k,那么从j+1到k-1(包括j+1到k-1)的所有位置都可以作为第三边,所以有(k- 1 - j)个三角形。

但是注意:在代码中,我们并不是每次重新从j+1开始找k,而是利用k的单调性(随着j增大,k只增不减),因此内层循环是O(n)的,整个算法是O(n^2)。以下是代码实现:

class Solution:def triangleNumber(self, nums: List[int]) -> int:nums.sort()  # 先排序count = 0n = len(nums)for i in range(n - 2):  # 第一个数的索引范围if nums[i] == 0:  # 如果第一个数是0,无法组成三角形continuek = i + 2  # 第三个数的起始位置for j in range(i + 1, n - 1):  # 第二个数的索引范围# 找到最大的k,使得nums[i] + nums[j] > nums[k]while k < n and nums[i] + nums[j] > nums[k]:k += 1# 计算有效三角形数量count += k - j - 1return count

相关文章:

  • 【大模型原理与技术-毛玉仁】第五章 模型编辑
  • 并行硬件环境及并行编程
  • Shell 命令及运行原理 + 权限的概念(7)
  • 手拉手处理RuoYi脚手架常见文问题
  • 【Qlib】Windows上Qlib安装与初步使用
  • 量子电路设计:以 Qiskit 为例
  • PicSharp(图片压缩工具) v1.1.6
  • 分享5个免费5个在线工具网站:Docsmall、UIED Tool在线工具箱、草料二维码、图片在线压缩、表情符号
  • python的numpy的MKL加速
  • 日志收集工具-Filebeat
  • 图卷积网络:从理论到实践
  • 22、模板特例化
  • triton学习笔记6: Fused Attention
  • 轻创业技术方案:基于格行双目摄像头的代理系统设计!低成本创业项目有哪些?2025轻资产创业项目排行榜前十名!0成本创业项目推荐!格行代理项目靠谱吗?
  • 在 Java 中!(逻辑非)和 ||(逻辑或)的优先级关系
  • Java 并发编程系列(上篇):多线程深入解析
  • C++与Python编程体验的多维对比:从语法哲学到工程实践
  • MATLAB-电偶极子所产出的电磁场仿真
  • 【HarmonyOS5】UIAbility组件生命周期详解:从创建到销毁的全景解析
  • Linux -- 进程信号
  • 独立创建网站/五个成功品牌推广案例
  • 珠海房地产网站建设/百度关键词挖掘查排名工具
  • 大学网站建设专业/网络营销的特点分别是
  • wordpress photolux/河北优化seo
  • 网站建设合同示范文本/软文代写网
  • 织梦网站在css中怎样做导航/志鸿优化网官网