16.go 835 B

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