611. 有效三角形的个数

101 阅读1分钟

题目:
给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

算法:
方法一:排序+二分
不记得了话,需要先理清楚组成三角形的条件:任意两边之和大于第三边。 如果我们对三条边进行排序a <= b <= c,那么可以得到:

  1. a < b + c
  2. b < a + c 只需要对排序后的数组枚举,满足c < a + b的个数即可。枚举的过程可以使用二分
func triangleNumber(nums []int) int {
    count := 0
    n := len(nums)
    // 排序
    sort.Ints(nums)
    // 最长边下标i
    for i := n - 1; i >= 2; i -- {
        // 次长边下边j,求最短边的index
        for j := i - 1; j >= 1; j -- {
            // 满足nums[index] + nums[j] > nums[i]的最小的index,index == j是意味着不存在这样的index
            index := get(nums, j, nums[i])
            count = count + j - index 
        }
    }

    return count
}


func get(nums []int, right, num int) int {
    left := 0
    b := nums[right]
    for left < right {
        mid := (left + right) / 2
        if nums[mid] + b <= num {
            left = mid + 1
        } else {
            if mid > 0 && nums[mid - 1] + b > num {
                right = mid - 1
            } else {
                return mid
            }
            
        }
    }
    return left
}