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

力扣-有效三角形的个数

1.题目描述

2.题目链接

611. 有效三角形的个数 - 力扣(LeetCode) 

3.题目代码

class Solution {public int triangleNumber(int[] nums) {//先排序Arrays.sort(nums);//若a<=b<=c,三角形条件可以优化为:a+b>cint temp=nums.length-1,sum=0;while(temp>1){int left=0,right=temp-1;while(left<right){if(nums[left]+nums[right]>nums[temp]){sum+=right-left;right--;}else {left++;}}temp--;}return sum;}
}

4.解题思路

1.有效三角形的条件

首先,我们要知道三角形形成的条件是:任意两边和大于第三边,也就是:

对于三条边长 a、b、c(假设 a≤b≤c),构成三角形需满足以下三个不等式同时成立:

  1. a+b>c
  2. a+c>b
  3. b+c>a

但是,我们可以先对数组进行排序,保证a<=b<=c,此时构成三角形的条件只需要满足:a+b>=c,因为c本身就大于a和b,所以c加上a或者b一定大于另一个数,2和3也就天然成立。

2.双指针和定数

这道题我们可以使用双指针和定数来解决

首先,定义一个定数temp让temp指向数组的最后一个元素,也就是temp=nums【nums.length-1】。

定义两个指针left和right分别让它们指向剩下数组的最左边和最右边,也就是left=0,right=temp=nums.length。

3.结合单调性移动双指针

1).nums【left】+nums【right】>nums【temp】,这时构成三角形,而且因为left和right分别是剩下数组的最左边和最右边,所以nums【left】和nums【right】也就是剩下数组的最小值和最大值

所以left到right之间的数,加上nums【right】都大于nums【left】>nums【right】>nums【temp】。也就是说,从left下标到right-1下标的数字,和right下标的数都可以构成三角形

所以我们直接让结果sum+=right-left

然后移动指针,让right指针左移,也就是right--。

2).nums【left】+nums【right】<=nums【temp】,因为nums【right】已经是剩下数组的最大值了,想要让不等式左边值变大满足三角形条件,就是需要nums【left】变大,也就是右移left指针,让left++。

直到left和right相遇,循环结束。此时我们改变temp定值,使temp左移一位。

5.代码细节

1)可以使用Arrays.sort(nums);来先对数组进行排序,这在很多题目里面非常重要。

Arrays.sort(nums);

2)因为left和right的定义是剩余数组的边界,所以left和right应该是随着temp的改变不断改变的,所以left和right应该定义在temp循环内部。

 while(temp>1){int left=0,right=temp-1;while(left<right){if(nums[left]+nums[right]>nums[temp]){sum+=right-left;right--;}else {left++;}}temp--;}

3)temp的while循环结束条件是temp>1,因为此时temp在数组第二个元素,他的左边只有1个元素,不可能构成三角形。

http://www.xdnf.cn/news/560593.html

相关文章:

  • 超低延迟音视频直播技术的未来发展与创新
  • (2025小白全踩坑版)【OpenHarmony】移植 3.1 版本系统到 STM32F407ZG开发板
  • 提问的艺术
  • 华为云Flexus+DeepSeek征文|Flexus云服务器Dify-LLM资源部署极致体验Agent
  • Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]]
  • labview硬件部分——压力测量
  • labview——控制继电器模块
  • Tiny C 编译器中,如何实现宏展开和头文件包含的预处理逻辑?
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)
  • 【深度学习】多目标融合算法(六):渐进式分层提取模型PLE(Progressive Layered Extraction)
  • 两个重要的alpha表达式
  • 三维表面轮廓仪的维护保养是确保其长期稳定运行的关键
  • 高速串行差分信号仿真分析及技术发展挑战
  • sqlsugar查看表结构并导出word文档
  • 【leetcode】70. 爬楼梯
  • leetcode 25. Reverse Nodes in k-Group
  • 民锋视角下的多因子金融分析模型实践
  • Vue组件通信方式及最佳实践
  • 【C++ 真题】P1075 [NOIP 2012 普及组] 质因数分解
  • openCV1.1 Mat对象
  • 中级统计师-统计学基础知识-第五章 相关分析
  • Day 0014:信息收集工具链
  • 搭建人工智能RAG知识库的主流平台与特点概述
  • 第9.2讲、Tiny Decoder(带 Mask)详解与实战
  • nfs存储IO等待,导致k8s业务系统卡慢问题处理
  • 基于R语言的贝叶斯网络模型实践技术应用:开启科研新视角
  • 安灯系统让注塑机故障响应快如闪电告别停机烦恼
  • 空调系统虚拟标定技术:新能源汽车能效优化的革命性突破
  • C++使用max_element()配合distance()求出vector中的最大值及其位置
  • Oracle基础知识(一)