双指针——三角形计数,就是一些细节处理要严谨,否则还是容易出错

382. 三角形计数

中文
English

给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?

样例

样例 1:

输入: [3, 4, 6, 7]
输出: 3
解释:
可以组成的是 (3, 4, 6), 
           (3, 6, 7),
           (4, 6, 7)

样例 2:

输入: [4, 4, 4, 4]
输出: 4
解释:
任何三个数都可以构成三角形
所以答案为 C(3, 4) = 4

class Solution:
    """
    @param S: A list of integers
    @return: An integer
    """
    def triangleCount(self, S):
        # write your code here
        # a+b > c
        # ==> a+b-c > 0
        # c=10 [3, 4, 6, 7] ==> l += 1
        # c=11 [3, 4, 6, 7] ==> l += 1
        # c=9 [3, 4, 6, 7] ==> r -= 1, ans += (r-1)
        
        def find_count(arr, k, c):
            l, r = 0, k
            ans = 0
            while l < r:
                if arr[l] + arr[r] <= c:
                    l += 1
                else:
                    ans += (r - l)
                    r -= 1
            return ans
        
        S.sort()
        ans = 0
        for i in range(len(S)-1, -1, -1):
            ans += find_count(S, i-1, S[i])
        return ans

 

posted @ 2021-01-12 00:30  bonelee  阅读(166)  评论(0编辑  收藏  举报