main.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package main
  2. import (
  3. "fmt"
  4. "sort"
  5. )
  6. func main() {
  7. var nums []int
  8. var target int
  9. //nums = []int{-1, 2, 2, 1, -4}
  10. //target = 1
  11. //fmt.Println(threeSumClosest(nums, target))
  12. //
  13. //nums = []int{-1, 2, 2, 1, -4}
  14. //target = 5
  15. //fmt.Println(threeSumClosest(nums, target))
  16. //
  17. //nums = []int{-1, 2, 2, 1, -4}
  18. //target = 3
  19. //fmt.Println(threeSumClosest(nums, target))
  20. //
  21. //nums = []int{-100, 1, 1, -1, -1, 3}
  22. //target = -1
  23. //fmt.Println(threeSumClosest(nums, target))
  24. nums = []int{1, 2, 5, 10, 11}
  25. target = 12
  26. fmt.Println(threeSumClosest(nums, target))
  27. }
  28. func abs(val int) int {
  29. if val > 0 {
  30. return val
  31. }
  32. return -val
  33. }
  34. func threeSumClosest(nums []int, target int) int {
  35. sort.Ints(nums)
  36. var closest, res int = 1000000, 0
  37. for i := 0; i < len(nums)-1; i++ {
  38. if i > 0 && nums[i] == nums[i-1] {
  39. continue
  40. }
  41. var j, k int = i + 1, len(nums) - 1
  42. for j < k {
  43. var count = nums[i] + nums[j] + nums[k]
  44. var distance = abs(count - target)
  45. fmt.Println(nums[i], nums[j], nums[k], count, distance, closest)
  46. if distance == 0 {
  47. return count
  48. }
  49. if distance < closest {
  50. res = count
  51. closest = distance
  52. }
  53. if count-target < 0 {
  54. j++
  55. }
  56. if count-target > 0 {
  57. k--
  58. }
  59. }
  60. }
  61. return res
  62. }