16.go 834 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package main
  2. import (
  3. "sort"
  4. )
  5. func abs(x int) int {
  6. if x < 0 {
  7. return -x
  8. }
  9. return x
  10. }
  11. // same as three sum
  12. func threeSumClosest(nums []int, target int) int {
  13. sort.Ints(nums)
  14. min := 1<<31 - 1
  15. res := 0
  16. for a := 0; a < len(nums)-2; a++ {
  17. // do NOT skip duplicated numbers!
  18. // [1 1 1 0], 100 -(skip 1)-> [1 1 0] 100 -> 2, WA
  19. b, c := a+1, len(nums)-1
  20. for b < c {
  21. sum := nums[a] + nums[b] + nums[c]
  22. if abs(sum-target) < min {
  23. res = sum
  24. min = abs(sum - target)
  25. }
  26. if sum < target {
  27. b++
  28. } else if sum > target {
  29. c--
  30. } else {
  31. return sum
  32. }
  33. }
  34. }
  35. return res
  36. }
  37. /* func main() {
  38. a1 := []int{-1, 0, 1, 2, -1, -4}
  39. fmt.Println(threeSumClosest(a1, 0))
  40. a2 := []int{-1, 0, -4}
  41. fmt.Println(threeSumClosest(a2, 0))
  42. a3 := []int{1, 1, 1, 0}
  43. fmt.Println(threeSumClosest(a3, 100))
  44. } */