美文网首页
Leetcode 611 有效的三角形个数

Leetcode 611 有效的三角形个数

作者: 钢笔先生 | 来源:发表于2019-08-08 13:30 被阅读0次

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.

相关文章

网友评论

      本文标题:Leetcode 611 有效的三角形个数

      本文链接:https://www.haomeiwen.com/subject/yhqxjctx.html