587. Erect the Fence
题意:输出把所有点包围起来的轮廓线上的点
我的思路:凸包问题,Graham-Scan算法
我的代码:
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; } };