611. 有效三角形的个数

168 阅读1分钟

题目:
给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 解法:
先排序,然后二分查找

import "sort"
func triangleNumber(nums []int) int {
    sort.Ints(nums)
    ans := 0
    for i := 0; i < len(nums); i ++ {
        for j := i+1; j < len(nums) ; j ++ {
            k := j 
            l, r := j + 1 , len(nums) - 1
            for l <= r {
                mid := (l + r) / 2
                if nums[mid] < nums[i] + nums[j] {
                    k = mid
                    l = mid + 1   // index <= mid的位置都满足条件,左右要向右搜索最后一个满足条件的位置
                } else {
                    r = mid - 1
                }
            }
            ans += k - j
        }
    }
    return ans
}