Leetcode 611 有效的三角形个数

Time: 2019-08-08

题目描述

给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。

示例 1:

输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
注意:

数组长度不超过1000。
数组里整数的范围为 [0, 1000]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-triangle-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

这是典型的双指针类问题,先排序,然后按照下面的原则判断是否为三角形:

  • 最长边的长度小于剩下的两边之和

我们逆序排列数组后,外层主循环表示当前最长的边,然后用两根指针分别指向此最长边下一个元素和数组最右边的元素,开始收缩。

若边界满足,则再向内,一定是都满足,所以,可以更新总数,并left += 1。

若边界不满足,表示两边之和太小,需要right -= 1.

因为:

  • left += 1 两边之和减少
  • right -= 1 两边之和增大

代码

class Solution:
   def triangleNumber(self, nums: List[int]) -> int:
       nums.sort(reverse=True)
       count = 0
       # 外层主循环,直到倒数第三个元素
       for i in range(len(nums) - 2):
           left = i + 1
           right = len(nums) - 1
           while left < right:
               if nums[i] >= nums[left] + nums[right]: # 不能组成三角形,收缩右边界
                   right -= 1
               else: # 能组成三角形,此时left右移动
                   count += (right - left)
                   left += 1
       return count

时空复杂度分析

排序时间复杂度:O(nlogn)

for循环内部时间复杂度如何分析???

相似题目

TBD.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 3,371评论 0 19
  • 数组 记录《剑指offer》中所有关于数组的题目,以及LeetCode中的相似题目 相关题目列表 说明 由于简书...
    wenmingxing阅读 1,532评论 1 12
  • 感恩朋友一家请我们一家吃火锅,在家吃又干净又好吃,孩子大人都很聊得来。 感恩客户慷慨大方,货没提就把款结了,...
    喜悦的霞光阅读 96评论 0 0
  • 谁在呼唤 寂静的森林 没有风 回声从中漫出马蹄 在岩石上 铺开一面镜子 镜子里 是一场困惑 语言已经干枯 孤寂...
    自耕者阅读 187评论 0 2
  • 分享10个靠谱且一定可以赚钱的副业,认真看有干货!!! 互联网从业6年,很多套路看的很清楚,所以我分享方法不一定让...
    HYFy阅读 442评论 0 0