题目:
给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。
算法:
方法一:排序+二分
不记得了话,需要先理清楚组成三角形的条件:任意两边之和大于第三边。
如果我们对三条边进行排序a <= b <= c,那么可以得到:
- a < b + c
- 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
}