一刷leetcode——計算幾何
阿新 • • 發佈:2018-01-25
isp return int urn play spa -o opened ack
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); } vectorView Code<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; } };
一刷leetcode——計算幾何