587. Erect the Fence
题意:输出把所有点包围起来的轮廓线上的点
我的思路:凸包问题,Graham-Scan算法
我的代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
class Solution { public: static bool cmp(Point& a, Point& b) { if (a.y == b.y) return a.x < b.x; return a.y < b.y; } bool mult(Point sp, Point ep, Point op) { return (sp.x-op.x)*(ep.y-op.y) > (ep.x-op.x)*(sp.y-op.y); } vector<Point> outerTrees(vector<Point>& points) { int n = points.size(); if (n <= 3) return points; sort(points.begin(), points.end(), cmp); vector<Point> ans; ans.push_back(points[0]); ans.push_back(points[1]); for (int i = 2; i < n; i++) { while (ans.size() > 1 && mult(points[i], ans[ans.size()-1], ans[ans.size()-2])) ans.pop_back(); ans.push_back(points[i]); } int len = ans.size()-1; ans.push_back(points[n-2]); for (int i = n-3; i >= 0; i--) { while (ans.size()-1 != len && mult(points[i], ans[ans.size()-1], ans[ans.size()-2])) ans.pop_back(); ans.push_back(points[i]); } ans.pop_back(); return ans; } };