def triangleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
res = 0
nums.sort()
for i in range(len(nums)-1,-1,-1): #先取最大的数
l,r = 0,i-1 # 最小的数和第二大的数
while l < r:# l=r时说明找完了
if nums[i] < nums[l] + nums[r]: #最小的加上第二大的比最大的大,
res += r-l #那么最小的数之后到第二大的数之间所有数都满足要求
r -= 1 #找完第二大的数对应的结果,继续找第三大的数
else:
l += 1 #最小的加上第二大的数小于等于最大的数,所以后移直到满足三角形条件
return res
def triangleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
res = 0
nums.sort()
for i in range(len(nums)):
for j in range(i+1,len(nums)): #首先让i,j是最小的两个边
l,r = j+1,len(nums)-1
while l <= r: #之后根据二分模板让r成为满足答案的最大的数,这里用到了模板等于时r=m-1,所以while也用等号让r出界成为满足答案的最大的数
m = l + (r-l)//2
if nums[m] >= nums[i] + nums[j]:
r = m - 1
else:
l = m + 1
res += r - j
return res