LeetCode-611. 有效三角形的个数

给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。

补充知识:构成三角形的条件:任意两条边的和大于第三边;
特殊情况:比如a>b>c,将数组排序之后,只需要满足a+b>c就可以,因为a+c>b,b+c>a一定成立

  1. 方法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

  1. 方法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

  1. 方法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

posted @ 2021-08-04 12:21  小Aer  阅读(5)  评论(0编辑  收藏  举报  来源