文章目录

  • 1. 题目
  • 2. 解题

1. 题目

在一个二维的花园中,有一些用 (x, y) 坐标表示的树。
由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树。
只有当所有的树都被绳子包围时,花园才能围好栅栏。
你需要找到正好位于栅栏边界上的树的坐标。

示例 1:
输入: [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]]
输出: [[1,1],[2,0],[4,2],[3,3],[2,4]]
解释:

示例 2:
输入: [[1,2],[2,2],[4,2]]
输出: [[1,2],[2,2],[4,2]]
解释:

即使树都在一条直线上,你也需要先用绳子包围它们。

注意:
所有的树应当被围在一起。你不能剪断绳子来包围树或者把树分成一组以上。
输入的整数在 0 到 100 之间。
花园至少有一棵树。
所有树的坐标都是不同的。
输入的点没有顺序。输出顺序也没有要求。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/erect-the-fence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

LintCode 题目地址:https://www.lintcode.com/problem/erect-the-fence/description

2. 解题

  • 将所有的点按 x,y 排序
  • 先将前面两个点加入答案,正序检查当前点跟答案里最后两个点组成的向量的叉积指向是否满足凸包要求,不满足,则将答案里最后一个点弹出,满足,则将点压入答案。得到下边界
  • 然后逆序检查,得到上边界,然后去重

下图考虑的是下边界,正序遍历的情况

/*** Definition for a point.* struct Point {*     int x;*     int y;*     Point() : x(0), y(0) {}*     Point(int a, int b) : x(a), y(b) {}* };*/
// LintCode 输入格式不太一样
struct cmp{bool operator()(const Point a, const Point b) const{return a.x<b.x || (a.x==b.x && a.y<b.y);}
};
class Solution {public:vector<Point> outerTrees(vector<Point> &points) {// write your code heresort(points.begin(), points.end(),[&](auto &a, auto &b){return a.x < b.x || (a.x == b.x && a.y < b.y);});vector<Point> ans;for(int i = 0; i < points.size(); ++i){while(ans.size()>=2 && dot(ans[ans.size()-2], ans[ans.size()-1],points[i]) < 0)ans.pop_back();ans.push_back(points[i]);}for(int i = points.size()-1; i >= 0; --i){while(ans.size()>=2 && dot(ans[ans.size()-2], ans[ans.size()-1],points[i]) < 0)ans.pop_back();ans.push_back(points[i]);}set<Point, cmp> set(ans.begin(), ans.end());vector<Point> res(set.begin(), set.end());return res;}int dot(Point& a, Point& b, Point& c){int x1 = b.x-a.x;int y1 = b.y-a.y;int x2 = c.x-b.x;int y2 = c.y-b.y;return x1*y2-x2*y1;}
};
// LeetCode
class Solution {public:vector<vector<int>> outerTrees(vector<vector<int>>& points) {sort(points.begin(), points.end());vector<vector<int>> ans;for(int i = 0; i < points.size(); ++i){while(ans.size()>=2 && dot(ans[ans.size()-2], ans[ans.size()-1],points[i]) < 0)ans.pop_back();ans.push_back(points[i]);}for(int i = points.size()-1; i >= 0; --i){while(ans.size()>=2 && dot(ans[ans.size()-2], ans[ans.size()-1],points[i]) < 0)ans.pop_back();ans.push_back(points[i]);}set<vector<int>> set(ans.begin(), ans.end());vector<vector<int>> res(set.begin(), set.end());return res;}int dot(vector<int>& a, vector<int>& b, vector<int>& c){int x1 = b[0]-a[0];int y1 = b[1]-a[1];int x2 = c[0]-b[0];int y2 = c[1]-b[1];return x1*y2-x2*y1;}
};
// 80 ms    22.9 MB C++

我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 587. 安装栅栏 / LintCode 1152. 安装栅栏(凸包检测:排序+叉积正负判断+正反扫描+去重)相关推荐

  1. linux验证cuda安装成功_linux # centos # 安装cuda

    注意: 千万不要在虚拟机机中操作,不会成功的.因为目前不支持. 要想成功,需要在实体机中操作. 准备 确认版本 主要确认CUDA toolkit和nvidia的驱动版本. 经过实践之后,发现最靠谱的确 ...

  2. VMware安装centos7,centos安装jdk,tomcat,mysql5.7,nginx,redis,ftp,日志分割

    1 centos7安装docker docker-compose docker安装软件 VMware安装centos7 centos安装jdk centos安装zookeeper centos安装to ...

  3. centos mysql安装_mysql yum源安装

    部署服务器环境的时候经常要安装mysql,以下是常见的安装方式 源码安装 rpm包安装 yum源安装 这篇主要介绍yum源安装. yum源下载 进入 https://dev.mysql.com/dow ...

  4. php amqp扩展安装,php扩展AMQP,安装报错解决

    接下来来安装php扩展AMQP,安装了它以后,才能用PHP操作rabbitmq. wget https://pecl.php.net/get/amqp-1.4.0.tgz tar -zxvf amqp ...

  5. Linux下的Memcache安装(含libevent的安装)

    Linux下Memcache服务器端的安装 服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.3.0 . 下载:http://www.danga.com/memca ...

  6. apache mediawiki 安装_MediaWiki系统的安装、配置和修改方法(转载)

    前提是你已经部署好了apache+php+mysql环境,如不会请网上搜索.windows下推荐使用xampp,一步安装到位. 从MediaWiki官网上下载最新版的MediaWiki,将软件压缩包上 ...

  7. docker 安装oracle_Windows系统下安装Docker,包你满意!

    如果使用的是Windows系统,则可以通过安装Docker Community Edition for Windows(Win10 专业版/企业版)或Docker Toolbox(Win7,Win8, ...

  8. windows 软件安装事件_苹果安装windows,报windows支持软件未能存储到所选驱动器

    今天去给一个IT外包客户维修电脑,前台的一台苹果电脑需要安装双系统,苹果电脑安装双系统对我们专业安装系统工程师来说,这不是很简单的嘛!客户问需要多长时间,信心满的说一到两个小时!客户说那你开始弄吧. ...

  9. centos 7.0 安装mysql_CentOS 7.0yum安装MySQL

    1.下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2.安装mysql-comm ...

最新文章

  1. Excel电子表格的使用技巧!很实用
  2. Angular sort interactively test
  3. opendds开发指南中文版_最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文...
  4. vsftpd使用方法小结、Linux安装JDK出现“NoClassDefFoundError: /Object”的解决方案、ubuntu 12.04安装jdk
  5. vue项目中iview表单验证 this.$refs[name].validate(valid = { }无效
  6. (03)FPGA与CPLD区别
  7. 【实践】一站式数据开发平台在有赞的最佳实践.pdf(附下载链接)
  8. AppDelegate文件下各方法的用法:(应用程序挂起、复原与终止)
  9. Hash算法入门指南(聊点不一样的算法人生)
  10. 读透《华为数据之道》
  11. 如何用excel做正交分析_excel表格分析正交数据处理-excel中怎么对正交试验进行F值检验...
  12. Proteus仿真-51单片机最小系统点亮LED
  13. (77)--用框架爬取博客园信息并保存到数据库
  14. linux 本地查看服务器图片-2种方式
  15. OPENWRT-LUCI开发总结-LUCI目录结构介绍
  16. m3u8转换为mp4格式
  17. 最简单的内网穿透教程
  18. 芯邦CMB2198A主控U盘量产工具V6000
  19. 十一、BDB ManyToMany
  20. 【NOIP2017提高A组模拟8.25】夜莺与玫瑰

热门文章

  1. 机器学习中各类算法的优缺点比较
  2. 集成学习之参数调整策略
  3. ctypes python_[python学习之路]ctypes,Python
  4. Navicat Premium连接SQL Server
  5. WPF XAML 从零开始认识XAML
  6. Weex 解决Print: Entry, :CFBundleIdentifier, Does Not Exist 错误方法
  7. JAVA多线程实现的三种方式 ()
  8. 洛谷P1901 发射站
  9. AC日记——集合位置 洛谷 P1491
  10. CentOS6.0 yum php mcrypt 扩展安装问题