class Solution:
def triangleNumber(self, nums: List[int]) -> int:
n = len(nums)
nums.sort()
ans = 0
# 固定最大边, a + b > c
for i in range(n - 1, 1, -1):
l, r = 0, i - 1
# 两数之和问题!
while l < r:
# 两数之和大于最大边,他们之间的所有值作为左端点,均可以和右端点构成答案
if nums[l] + nums[r] > nums[i]:
ans += r - l
r -= 1
else:
# 小于最大边,构不成答案,之后的右端点都需要更大的左端点才有可能继续构成答案
l += 1
return ans
#回溯法
def help(nums):
a,b,c = nums[0],nums[1],nums[2]
if a+b>c and a+c>b and c+b>a and a-b<c and a-c<b and c-b<a:
return True
return False
def huisu(index,path,count,nums):
if len(path)==3 and help(path):
count.append(0)
return
if len(path)>3:
return
for i in range(index,len(nums)):
path.append(nums[i])
huisu(i+1,path,count,nums)
path.pop()
count = []
nums = [2,2,3,4]
huisu(0,[],count,nums)
return len(count)
题目分析:
1、回溯法
这个就是所谓的全排列的问题,是回溯算法非常经典的一个应用,但是必须搞清楚的是判断三个数能否组成三角形的条件,如此一来就比较简单了。
2、排序+双指针法
先对整个数据进行升序排序排序,然后从i=2开始固定一个最大边,在判断其余两边之后是不是大于第三边。如果最小的两个边都大于最大的边了,那么自然满足判定三角形的条件了。固定一个最大边,然后在l和r这个区间进行判断,如果其结果是大于第三边,那么是没问题的,如果结果不是大于第三边。