587. Erect the Fence
Description
You are given an array trees
where trees[i] = [xi, yi]
represents the location of a tree in the garden.
You are asked to fence the entire garden using the minimum length of rope as it is expensive. The garden is well fenced only if all the trees are enclosed.
Return the coordinates of trees that are exactly located on the fence perimeter.
Example 1:
Input: points = [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]] Output: [[1,1],[2,0],[3,3],[2,4],[4,2]]
Example 2:
Input: points = [[1,2],[2,2],[4,2]] Output: [[4,2],[2,2],[1,2]]
Constraints:
1 <= points.length <= 3000
points[i].length == 2
0 <= xi, yi <= 100
- All the given points are unique.
Solution
erect-the-fence.py
class Solution:
def outerTrees(self, points: List[List[int]]) -> List[List[int]]:
points = sorted(map(tuple, points), key=lambda x:(x[0], x[1]))
def sign(o, a, b):
return (a[0]-o[0]) * (b[1]-o[1]) - (b[0]-o[0]) * (a[1]-o[1])
def build(points):
hull = []
for p in points:
while len(hull) >= 2 and sign(hull[-2], hull[-1], p) < 0:
hull.pop()
hull += p,
return hull
return list(set(build(points) + build(points[::-1])))