题目
给定一个包含非负整数的数组 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 <= nums.length <= 1000
- 0 <= nums[i] <= 1000
思路
把因为示例上的答案是从小到大排列的,因此要考虑去重。在统计合法三元组 (a,b,c) 的个数时,不能把 (c,b,a) 这样的三元组也统计进去
三角形性质:两边之和大于第三边
- a+b>c(此处必然成立的, a+c≥a+b>b(a≥1))
- a+c>b(也必然成立,因为 b+c≥a+a=2a>a)
- b+c>a
所以只需要考虑第一个式子,那么问题变成,从 nums 中选三个数,满足 1≤a≤b≤c 且 a+b>c 的方案数。
时空复杂度
时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)
参考代码
python
class Solution:
def triangleNumber(self, nums: List[int]) -> int:
nums.sort()
n = 0
for k in range(2,len(nums)):
i = 0
j = k-1
while i<j:
if nums[i]+nums[j]> nums[k]:
n+= j-i
j-=1
else:
i+=1
return n