1. 程式人生 > >一刷leetcode——計算幾何

一刷leetcode——計算幾何

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);
    }
    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; } };
View Code

一刷leetcode——計算幾何