| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 | 
							- type Points []Point
 
- func (pts Points) Len() int { return len(pts) }
 
- func (pts Points) Less(i, j int) bool {
 
- 	if pts[i].X != pts[j].X {
 
- 		return pts[i].X < pts[j].X
 
- 	}
 
- 	return pts[i].Y < pts[j].Y
 
- }
 
- func (pts Points) Swap(i, j int) { pts[i], pts[j] = pts[j], pts[i] }
 
- type none struct{}
 
- /**
 
-  * Definition for a point.
 
-  * type Point struct {
 
-  *     X int
 
-  *     Y int
 
-  * }
 
-  */
 
- func outerTrees(points []Point) []Point {
 
- 	k, n := 0, len(points)
 
- 	sort.Sort(Points(points))
 
- 	pts := make([]Point, n)
 
- 	for i := 0; i < n; i++ {
 
- 		for 1 < k { // a x b = dx1*dy2 - dx2*dy1 <= 0
 
- 			dx1, dx2 := pts[k-1].X-pts[k-2].X, points[i].X-pts[k-1].X
 
- 			dy1, dy2 := pts[k-1].Y-pts[k-2].Y, points[i].Y-pts[k-1].Y
 
- 			if dx1*dy2 <= dx2*dy1 {
 
- 				break
 
- 			}
 
- 			k--
 
- 		}
 
- 		pts[k] = points[i]
 
- 		k++
 
- 	}
 
- 	set := make(map[Point]none)
 
- 	for i := 0; i < k; i++ {
 
- 		set[pts[i]] = none{}
 
- 	}
 
- 	k = 0
 
- 	for i := n - 1; 0 <= i; i-- {
 
- 		for 1 < k { // a x b = dx1*dy2 - dx2*dy1 <= 0
 
- 			dx1, dx2 := pts[k-1].X-pts[k-2].X, points[i].X-pts[k-1].X
 
- 			dy1, dy2 := pts[k-1].Y-pts[k-2].Y, points[i].Y-pts[k-1].Y
 
- 			if dx1*dy2 <= dx2*dy1 {
 
- 				break
 
- 			}
 
- 			k--
 
- 		}
 
- 		pts[k] = points[i]
 
- 		k++
 
- 	}
 
- 	for i := 0; i < k; i++ {
 
- 		set[pts[i]] = none{}
 
- 	}
 
- 	res := make([]Point, len(set))
 
- 	k = 0
 
- 	for p, _ := range set {
 
- 		res[k] = p
 
- 		k++
 
- 	}
 
- 	return res
 
- }
 
 
  |