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) }