587.erect-the-fence.go 1.3 KB

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