| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 | type Points []Pointfunc (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}
 |