给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例 1:
输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-triangle-number
解法1: 排序+二分+双重for循环-通过
给出三角形的两个边,在排序好的空间上,二分查找使三角形成立的最大边,然后计算个数
查找过程如下:
代码:
class Solution:
def triangleNumber(self, nums: List[int]) -> int:
return solve4(nums)
def solve4(nums):
n = len(nums)
m = 3
if n<m:return 0
nums.sort()
count = 0
for i in range(n-2):
for j in range(i+1,n-1):
l = j+1
r = n - 1
while l <= r:
m = (l + r) // 2
if nums[i]+nums[j]<=nums[m]:
r = m-1
else:
l = m+1
count += r-j
return count
解法2- 长度为3的子集中找合法三角形边 - 超时
长度为3的子集,子集排序,判断两个小边之和是否大于第三边
相当于穷举所有三角形
class Solution:
def triangleNumber(self, nums: List[int]) -> int:
return solve1(nums)
from itertools import combinations
def check(ns):
return ns[0]+ns[1]>ns[2] and ns[1]+ns[2]>ns[0] and ns[0]+ns[2]>ns[1]
def solve1(nums):
nums = filter(lambda ns:check(ns),combinations(nums,3))
return len(list(nums))
nums = [2,2,3,4]
ans = solve1(nums)