LeetCode 587 安装栅栏[凸包算法 Jarvis算法] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 587 安装栅栏[凸包算法 Jarvis算法] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。



解题思路:
今日的每日一题是博主第一次接触凸包问题,凸包问题是解决几何中包围问题的重要解法,这里只介绍其中的Jarvis算法。Jarvis算法思想很简单,首先找到凸包上的点(一般从最左边出发)作为p,然后假定一个q,再遍历所有点,用来更新q使得所有点都在pq向量左边,这要通过向量的叉积实现(定义cross函数),叉积大于0则都在左边,小于零在右边,等于零在一条直线上,这时候要把该点直接加入到集合中,遍历过的q要标记为访问,并把p更新为q,如此直到回到起点,则凸包形成,代码如下:

class Solution 
public:
    int cross(vector<int>& p, vector<int>& q,vector<int>& r) 
        return (q[0] - p[0]) * (r[1] - q[1]) - (q[1] - p[1]) * (r[0] - q[0]);
    

    vector<vector<int>> outerTrees(vector<vector<int>>& trees) 
        int n = trees.size();
        if(n < 4) return trees;
        // 找最左边的点
        int leftMost = 0;
        for(int i = 1; i < n; i ++) 
            if(trees[i][0] < trees[leftMost][0]) 
                leftMost = i;
            
        
        vector<vector<int>> res;
        vector<bool> visited(n, false);
        int p = leftMost;
        do 
            int q = (p + 1) % n;
            // 找到在r右边的q
            for(int r = 0; r < n; r ++) 
                // 如果r在pq的右边
                if(cross(trees[p], trees[q], trees[r]) < 0) 
                    q = r;
                
            
            // 判断是否有i在pq之间
            for(int i = 0; i < n; i ++) 
                if(visited[i] || i == p || i == q) 
                    continue;
                
                if(cross(trees[p], trees[q], trees[i]) == 0) 
                    res.emplace_back(trees[i]);
                    visited[i] = true;
                
            
            if(!visited[q]) 
                res.emplace_back(trees[q]);
                visited[q] = true;
            
            p = q;
         while(p != leftMost); // 最后回归起点
        return res;
    
;

以上是关于LeetCode 587 安装栅栏[凸包算法 Jarvis算法] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 587.安装栅栏

587. Erect the Fence(凸包算法)

一刷leetcode——计算几何

2022-02-19:安装栅栏。 在一个二维的花园中,有一些用 (x, y) 坐标表示的树。由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树。只有当所有的树都被绳子包围时,花园才能围好栅栏。

算法笔记_016:凸包问题(Java)

数据结构与算法之深入解析“安装栅栏”的求解思路与算法示例