[路飞]_Leetcode 611. 有效三角形的个数

53 阅读2分钟

「携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

今天我们来做一下今天的leetcode上一道中等题

题目链接在这里611. 有效三角形的个数

题意

image.png

题目给了我们一个整数数组,数字的大小代表边长,让我们输出其中可以组成三角形的三元组合的数量。 有重复的数字,但是区分数字的位置

接下来,我们就来分析下这道题的思路。

思路

  • 首先,我们知道如果三条边中,两条较小边的长度大于最长边的长度的话,那么这三条边可以组成三角形。
  • 其次,因为需要按照大小枚举,所以我们自然而然就会想到排序。也就是,按照从大到小排序,然后,我们可以先枚举最大值,然后再枚举两个较小值,通过判断确定那些组合满足条件。
    • 具体要如何做呢?
    • 我们可以先从后往前枚举最大边长i,然后在下标2~i范围中使用双指针枚举两条较小边
    • 声明l=0,r=i-1,次小边也从大到小进行枚举,最小边从小到大进行枚举。
    • 然后我们就可以判断当前的l r两个小边的边长和是否大于 最大边i,来进行下一步操作。
      • 如果大于的话,由于最小边是从小到大枚举的,所以可以知道当前情况下最小边从l~r-1这r-l个值中任意取值,都可以满足 nums[l]+nums[r] > nums[i],那么,我们就可以更新结果,然后将次大边长度再次缩小,尝试下一个边长的可能性。
      • 如果小于的话,我们只能增加最小边的值来寻找下一个可能性。因为两个大边都是从大到小枚举的。
      • 按照上面的思路,在三个指针不重叠的情况下,确定最大边,然后确定次大边,更新结果,最终遍历完数组之后,问题答案也就呼之欲出了。🎉🎉🎉

代码实现

image.png

了解了上面的思路之后,代码实现其实就非常简单了😎。

结束语

如果有更好的分析思路,欢迎大家在评论区发表看法!⛄