LeetCode-611. 有效三角形的个数
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
补充知识:构成三角形的条件:任意两条边的和大于第三边;
特殊情况:比如a>b>c,将数组排序之后,只需要满足a+b>c就可以,因为a+c>b,b+c>a一定成立
- 方法1使用两个循环进行两条边的判断,内层使用二分查找,寻找第三条边
class Solution:
def triangleNumber(self, nums: List[int]) -> int:
n = len(nums)
nums.sort()
ans = 0
for i in range(n):
for j in range(i + 1, n):
left, right, k = j + 1, n - 1, j
while left <= right:
mid = (left + right) // 2
if nums[mid] < nums[i] + nums[j]:
k = mid
left = mid + 1
else:
right = mid - 1
ans += k - j
return ans
- 方法2使用第一个for作为第一条边,第二个for作为第二条边,里层while循环k,依次判断符合条件的数值
class Solution:
def triangleNumber(self, nums: List[int]) -> int:
n = len(nums)
ans = 0
nums.sort()
for i in range(n - 2):
if nums[i] == 0: continue
k = i + 2
for j in range(i + 1, n - 1):
while k < n and nums[i] + nums[j] > nums[k]:
k += 1
ans += k - j - 1
return ans
- 方法3原理和方法2一样,使用了双指针方法,只不过方法3的k从i开始计算,所以使用了max(k - j, 0)预防k-j<0的情况发生,特别是出现0的情况就有可能发生,比如nums[k + 1] = nums[i] + nums[j] = 0 + nums[j]
class Solution:
def triangleNumber(self, nums: List[int]) -> int:
n = len(nums)
nums.sort()
ans = 0
for i in range(n):
k = i
for j in range(i + 1, n):
while k + 1 < n and nums[k + 1] < nums[i] + nums[j]:
k += 1
ans += max(k - j, 0)
return ans