当前位置:网站首页>【Leetcode-每日一题】安装栅栏

【Leetcode-每日一题】安装栅栏

2022-04-23 15:25:00 牡蛎给芝加哥带来了海

安装栅栏
难度:困难
在这里插入图片描述
在这里插入图片描述

代码如下:

class Solution {
    
    int[] subtraction(int[] a, int[] b) {
     // 向量相减
        return new int[]{
    a[0] - b[0], a[1] - b[1]};
    }
    double cross(int[] a, int[] b) {
     // 叉乘
        return a[0] * b[1] - a[1] * b[0];
    }
    double getArea(int[] a, int[] b, int[] c) {
     // 向量 ab 转为 向量 ac 过程中扫过的面积
        return cross(subtraction(b, a), subtraction(c, a));
    }
    public int[][] outerTrees(int[][] trees) {
    
        Arrays.sort(trees, (a, b)->{
    
            return a[0] != b[0] ? a[0] - b[0] : a[1] - b[1];
        });
        int n = trees.length, tp = 0;
        int[] stk = new int[n + 10];
        boolean[] vis = new boolean[n + 10];
        stk[++tp] = 0; // 不标记起点
        for (int i = 1; i < n; i++) {
    
            int[] c = trees[i];
            while (tp >= 2) {
    
                int[] a = trees[stk[tp - 1]], b = trees[stk[tp]];
                if (getArea(a, b, c) < 0) vis[stk[tp--]] = false;
                else break;
            }
            stk[++tp] = i;
            vis[i] = true;
        }
        int size = tp;
        for (int i = n - 1; i >= 0; i--) {
    
            if (vis[i]) continue;
            int[] c = trees[i];
            while (tp > size) {
    
                int[] a = trees[stk[tp - 1]], b = trees[stk[tp]];
                if (getArea(a, b, c) < 0) {
    
                    // vis[stk[tp--]] = false; // 非必须
                    tp--;
                }
                else break;
            }
            stk[++tp] = i;
            // vis[i] = true; // 非必须
        }
        int[][] ans = new int[tp - 1][2];
        for (int i = 1; i < tp; i++) ans[i - 1] = trees[stk[i]];
        return ans;
    }
}

在这里插入图片描述

版权声明
本文为[牡蛎给芝加哥带来了海]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_39143263/article/details/124360211