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

文章目录

    • 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阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arduino读取水位传感器的数据显示在基于i2c的1602a上_XSB-IC-S2智能水位监测仪-老友网...

XSB-IC-S2智能水位监测仪 多功能本身就是智能仪器仪表的一个特点。例如&#xff0c;为了设计速度较快和结构较复杂的数字系统&#xff0c;仪器生产厂家制造了具有脉冲发生器、频率合成器和任意波形发生器等功能的函数发生器。这种多功能的综合型产品不但在性能上(如准确度)比专…

七夕小案例:用代码给心爱的她画一个爱心

一、爱心示例&#xff1a; 二、开始写代码&#xff1a; /* * Hi。宝贝&#xff01; * 这么久了。还没和宝贝说过我的工作呢&#xff01; * 我是个前端工程师。俗称程序员。网页相关。 * 如这个页面。就是个什么也没有的网页。 * 我的工作就是给这种空白的页面加点儿东西。 * 嗯…

小案例:13行python代码实现对微信进行推送消息

一、前言&#xff1a; Python可以实现给QQ邮箱、企业微信、微信等等软件推送消息&#xff0c;今天咱们实现一下Python直接给微信推送消息。 这里咱们使用了一个第三方工具pushplus 二、单人推送 实现步骤&#xff1a; 1、用微信注册一个此网站的账号 2、将token复制出来&am…

python书籍_Python书籍大汇总——入门到实战

学习Python的朋友们越来越多&#xff0c;当当网和京东上面的Python类编程书籍&#xff0c;也从几年前寥寥无几到现在多的不知道选哪本才好了的地步。无论是自学还是参加培训班跟着老师学习&#xff0c;我们都需要几本实用的Python书&#xff0c;系统全面的掌握Python编程的相关…

LeetCode 87. 扰乱字符串(记忆化递归 / DP)

文章目录1. 题目2. 解题2.1 记忆化递归2.2 动态规划1. 题目 给定一个字符串 s1&#xff0c;我们可以把它递归地分割成两个非空子字符串&#xff0c;从而将其表示为二叉树。 下图是字符串 s1 “great” 的一种可能的表示形式。 great/ \gr eat/ \ / \ g r e a…

问题总结:一个 list 使用 for 遍历,边循环边删除的问题

一、需求&#xff1a; 对一个 list 数据类型写一个循环删除的程序 二、问题 来&#xff0c;我们来看看代码跟效果&#xff1a; # 初始化一个 list 列表&#xff0c;为了下边的方便比较&#xff0c;我就使用跟 list 索引来做 list 的元素 datas [0,1,2,3,4]# 打印元素组&am…

cpu使用率_漫话性能:CPU使用率

序言CPU 使用率是最直观和最常用的系统性能指标&#xff0c;更是我们在排查性能问题时&#xff0c;通常会关注的第一个指标。节拍率为了维护 CPU 时间&#xff0c;Linux 通过事先定义的节拍率&#xff08;内核中表示为 HZ&#xff09;&#xff0c;触发时间中断&#xff0c;并使…

谁动了我的产品

2014年3月中旬离开了自己奋斗三年的公司&#xff0c;这是一家海关政府公司&#xff0c;三年里无论是做项目需求分析、项目开发、项目测试、项目上线实施、项目上线跟踪、收集反馈、做项目版本修改&#xff0c;我和我的团队都在一个有非常明确目标、有非常明确思路的过程中&…

LeetCode 352. 将数据流变为多个不相交区间(map二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个非负整数的数据流输入 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;…&#xff0c;将到目前为止看到的数字总结为不相交的区间列表。 例如&#xff0c;假设数据流中的整数为 1&#xff0c;3&#xff0c;7&#xff0c;2&…

windows键按了没反应_windows快捷键使用 - 小怜

1、总的参考图&#xff1a;2、ctrl的组合使用&#xff1a;1与shift键结合&#xff1a;2 ctrl shift del # 快速清除浏览器缓存记录3 ctrl shift N # 浏览器当中&#xff0c;快速打开无痕新窗口。chrome内核的应该都可以&#xff0c;chrome和新…

Python倒计时自动发微信(电脑版微信)

一、前言&#xff1a; Python倒计时自动发微信&#xff08;电脑版微信登录状态&#xff09; 二、主要思路及步骤&#xff1a; 1、先启动微信 2、定位到搜索框 3、搜索微信 4、进入聊天窗口 5、粘贴文本内容 6、发送 7、关闭微信窗口 三、代码&#xff1a; import …

win10主题更换_还不升级? win10精简版不到10G,运行比win7还快,旧电脑的福音

即使现在win7系统已经停止了服务&#xff0c;但是还有许多人宁愿面对随时有可能出现问题的win7&#xff0c;还是不愿升级win10系统。至于原因&#xff0c;五花八门&#xff0c;比如win7兼容性和稳定性更好&#xff0c;比如win10经常更新&#xff0c;还有许多软件无法在win10环境…

LeetCode 1732. 找到最高海拔

文章目录1. 题目2. 解题1. 题目 有一个自行车手打算进行一场公路骑行&#xff0c;这条路线总共由 n 1 个不同海拔的点组成。 自行车手从海拔为 0 的点 0 开始骑行。 给你一个长度为 n 的整数数组 gain &#xff0c;其中 gain[i] 是点 i 和点 i 1 的 净海拔高度差&#xff0…

小案例:利用python估算最外轮廓区域面积

一、需求&#xff1a; 给出一张图片&#xff0c;估算最外轮廓区域面积 二、步骤&#xff1a; 1、读取图片信息 2、利用open-cv&#xff0c;自适应分割图片 3、提取最外轮廓像素值 4、利用像素值标记轮廓 5、计算轮廓面积 三、代码&#xff1a; import cv2# 读取图片信息…

ApplicationContext容器的设计原理

1.在ApplicationContext容器中&#xff0c;我们以常用的FileSystemXmlApplicationContext的实现为例来说明ApplicationContext容器的设计原理。 2.在FileSystemXmlApplicationContext的设计中&#xff0c;我们看到ApplicationContext应用上下文的主要功能已经在FileSystemXmlAp…

使用c++查看linux服务器某个进程正在使用的内存_Linux 系统管理

1、进程管理介绍什么是进程程序是人使用计算机语言编写的&#xff0c;可以实现一定功能&#xff0c;并且可以执行的代码集合进程是正在执行当中的程序。程序在执行时&#xff0c;执行人的权限和属性、以及程序的代码都会被加载进内存&#xff0c;操作系统给这个进程分配一个 ID…

小案例:利用Python写个教师常用的点名软件

一、需求&#xff1a; 教师上课常用的点名软件 二、python库安装&#xff1a; openpyxl是Python中用于读写excel文件tkinter是Python中GUI编程非常好用的库&#xff0c;而且是标准库&#xff0c;不需要安装&#xff0c;导入即可使用random库是Python中用于实现随机功能的库&…

python contains类似函数_01--实际工作中,python基础理念和数据处理

1.工作中遇到的python坑1.1 合并文件问题&#xff1a;正常将文件依次读取并append时&#xff0c;莫名出现很多空行。解决&#xff1a;在append前删除空行&#xff1a;data_tmp 1.2 重复数据行问题&#xff1a; append多日文件时&#xff0c;由于人工误操作&#xff0c;容易存在…

小案例:利用Python实现图片上下、左右翻转

一、前言需求&#xff1a; 对图片进行操作&#xff0c;使图片上下、左右翻转 二、函数库&#xff1a; 使用Pillow模块提供的transpose()方法可以让图像翻转&#xff0c;上下翻转&#xff0c;或者左右翻转 三、操作说明&#xff1a; 原图如下&#xff1a; 图片上下翻转代码…

LeetCode 1736. 替换隐藏数字得到的最晚时间

文章目录1. 题目2. 解题1. 题目 给你一个字符串 time &#xff0c;格式为 hh:mm&#xff08;小时&#xff1a;分钟&#xff09;&#xff0c;其中某几位数字被隐藏&#xff08;用 ? 表示&#xff09;。 有效的时间为 00:00 到 23:59 之间的所有时间&#xff0c;包括 00:00 和…