587.erect-the-fence.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. type Points []Point
  2. func (pts Points) Len() int { return len(pts) }
  3. func (pts Points) Less(i, j int) bool {
  4. if pts[i].X != pts[j].X {
  5. return pts[i].X < pts[j].X
  6. }
  7. return pts[i].Y < pts[j].Y
  8. }
  9. func (pts Points) Swap(i, j int) { pts[i], pts[j] = pts[j], pts[i] }
  10. /**
  11. * Definition for a point.
  12. * type Point struct {
  13. * X int
  14. * Y int
  15. * }
  16. */
  17. func outerTrees(points []Point) []Point {
  18. k, n := 0, len(points)
  19. if n == 1 {
  20. return points
  21. }
  22. sort.Sort(Points(points))
  23. pts := make([]Point, n)
  24. for i := 0; i < n; i++ {
  25. for 1 < k { // a x b = dx1*dy2 - dx2*dy1 <= 0
  26. dx1, dx2 := pts[k-1].X-pts[k-2].X, points[i].X-pts[k-1].X
  27. dy1, dy2 := pts[k-1].Y-pts[k-2].Y, points[i].Y-pts[k-1].Y
  28. if dx1*dy2 <= dx2*dy1 {
  29. break
  30. }
  31. k--
  32. }
  33. pts[k] = points[i]
  34. k++
  35. }
  36. set := make(map[Point]bool)
  37. for i := 0; i < k; i++ {
  38. set[pts[i]] = true
  39. }
  40. k = 0
  41. for i := n - 1; 0 <= i; i-- {
  42. for 1 < k { // a x b = dx1*dy2 - dx2*dy1 <= 0
  43. dx1, dx2 := pts[k-1].X-pts[k-2].X, points[i].X-pts[k-1].X
  44. dy1, dy2 := pts[k-1].Y-pts[k-2].Y, points[i].Y-pts[k-1].Y
  45. if dx1*dy2 <= dx2*dy1 {
  46. break
  47. }
  48. k--
  49. }
  50. pts[k] = points[i]
  51. k++
  52. }
  53. for i := 0; i < k; i++ {
  54. set[pts[i]] = true
  55. }
  56. res := make([]Point, len(set))
  57. k = 0
  58. for p, _ := range set {
  59. res[k] = p
  60. k++
  61. }
  62. return res
  63. }