611.valid-triangle-number.go 589 B

123456789101112131415161718192021222324252627282930
  1. func triangleNumber(nums []int) int {
  2. n, cnt := len(nums), 0
  3. sort.Ints(nums)
  4. m := make(map[int]int)
  5. for i := 0; i < n-2; i++ {
  6. for j := i + 1; j < n-1; j++ {
  7. sum := nums[i] + nums[j]
  8. if v, ok := m[sum]; ok {
  9. if j < v {
  10. cnt += v - j - 1
  11. }
  12. } else {
  13. beg, end := j, n-1 // Not j+1, but j
  14. for beg <= end {
  15. mid := beg + (end-beg)/2
  16. if nums[mid] < sum {
  17. beg = mid + 1 // So beg is the first idx that >= sum
  18. } else {
  19. end = mid - 1
  20. }
  21. }
  22. m[sum] = beg
  23. if j < beg {
  24. cnt += beg - j - 1
  25. }
  26. }
  27. }
  28. }
  29. return cnt
  30. }