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

好未来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
http://www.xdnf.cn/news/12529.html

相关文章:

  • 青少年编程与数学 01-011 系统软件简介 07 iOS操作系统
  • ClusterRole 和 ClusterRoleBinding 的关系及使用
  • EPPLUS——CAD c#读写EXCEL的第三方库
  • 怎么让自己ip显示外省?一文说清操作
  • moon游戏服务器-demo运行
  • Lodash原型污染漏洞原理详解
  • [HCTF 2018]admin 1
  • N元语言模型 —— 一文讲懂!!!
  • 设计模式-观察着模式
  • 关于脏读,幻读,可重复读的学习
  • C++中的排列组合算法详解
  • SUSE Linux 发行版全面解析:从开源先驱到企业级支柱
  • element树结构el-tree,默认选中当前setCurrentKey无效
  • golang项目中如何使用私密仓库的扩展包
  • 1.4 Node.js 的 TCP 和 UDP
  • 基于 STM32 的四路 PWM 控制智能小车运动的模块化控制程序
  • PDF图片和表格等信息提取开源项目
  • FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍
  • Web前端基础:JavaScript
  • C++字符串解析2
  • yolov11与双目测距结合,实现目标的识别和定位测距(onnx版本)
  • Docker、Wsl 打包迁移环境
  • |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面
  • pycharm 中文字体报错
  • 从零开始搭建 Pytest 测试框架(Python 3.8 + PyCharm 版)
  • Android Studio 解决首次安装时下载 Gradle 慢问题
  • spring中的@RabbitListener注解详解
  • C++设计模式 - 单例模式
  • Python Copilot【代码辅助工具】 简介
  • AI数据分析在体育中的应用:技术与实践