1 先排序
2 三个指针 a b c
a 是固定的 b c是滑动指针
如果 arr[a] + arr[b] > arr[c] (三角形特性)
那么和 ab 能成功匹配的极限c值就是第一个大于等于arr[a] + arr[b] 的前一个位置 (由于排序的原因 这里就跳过了很多无效的匹配) 。 周而复始即可。
package main
import (
"fmt"
"sort"
)
func main() {
var arr []int
var count int
fmt.Scanln(&count)
if count < 3 {
fmt.Println(0)
return
}
for i := 0; i < count; i++ {
var num int
fmt.Scanf("%d", &num)
arr = append(arr, num)
}
// 尺取
sort.Ints(arr)
ans := 0
for i := 0; i < len(arr) - 2; i ++ {
l, r := i + 1, i + 2
for r < len(arr) {
if r == l {
r ++
continue
}
// 任意两边和大于另一个边
abSum := arr[i] + arr[l]
if abSum > arr[r] {
mostLessRight := r
for mostLessRight < len(arr) && arr[mostLessRight] < abSum {
mostLessRight ++
}
ans += mostLessRight - r
l ++
}else {
l ++
}
}
}
fmt.Println(ans)
}

京公网安备 11010502036488号