题目在这:https://leetcode-cn.com/problems/valid-triangle-number/
思路分析:
直接三重暴力循环直接超时。。。
三角形的三边条件:两边之和大于第三边嘛。我们可以使用三指针 来做这道题。
首先对于所给数组进行排序,降序排序~。
假设降序排序后得到的数组为 [4,3,2,2]
.
我们使 p1指向4, p2指向3 , p3 指向末尾的2。
判断p2加上p3是否大于p1 ,
如果大于 则p2到p3之间所有的数都可以使用,都是大于p1的。因为p3指向的是最小边,若移动p3 ,则必然会更大。
所以此时符合条件的数 为 p3-p2 。
然后我们将p2变小,即往后移动,继续试探。
如果 p3+p2 不大于p1 ,则我们将p3变大 ,往左移动,继续试探。
将上述操作全部放到循环里,该循环控制p1的指针位置。
完整代码:
res = 0
nums.sort(reverse=True)
for p1 in range(len(nums)-2): # 不包含len(nums)-2 也就是p1最后一个元素是倒数第三个元素
p2 = p1 + 1
p3 = len(nums) - 1
while p2 < p3:
if nums[p3] + nums[p2] > nums[p1]:
res += p3 - p2
p2 += 1 # 将p2减小 指针往右移动 继续试探
else:
p3 -= 1 # 变大p3 指针往左移动 继续试探
print(res)
return res