原题链接
一. 题目描述
给你一个二维整数数组 point
,其中 points[i] = [xi, yi]
表示二维平面内的一个点。同时给你一个整数 w
。你需要用矩形 覆盖所有 点。
每个矩形的左下角在某个点 (x1, 0)
处,且右上角在某个点 (x2, y2)
处,其中 x1 <= x2
且 y2 >= 0
,同时对于每个矩形都 必须 满足 x2 - x1 <= w
。
如果一个点在矩形内或者在边上,我们说这个点被矩形覆盖了。
请你在确保每个点都 至少 被一个矩形覆盖的前提下,最少 需要多少个矩形。
注意:一个点可以被多个矩形覆盖。
示例 1:
输入:points = [[2,1],[1,0],[1,4],[1,8],[3,5],[4,6]], w = 1
输出:2
解释:
上图展示了一种可行的矩形放置方案:
- 一个矩形的左下角在
(1, 0)
,右上角在(2, 8)
。 - 一个矩形的左下角在
(3, 0)
,右上角在(4, 8)
。
示例 2:
输入:points = [[0,0],[1,1],[2,2],[3,3],[4,4],[5,5],[6,6]], w = 2
输出:3
解释:
上图展示了一种可行的矩形放置方案:
- 一个矩形的左下角在
(0, 0)
,右上角在(2, 2)
。 - 一个矩形的左下角在
(3, 0)
,右上角在(5, 5)
。 - 一个矩形的左下角在
(6, 0)
,右上角在(6, 6)
。
示例 3:
输入:points = [[2,3],[1,2]], w = 0
输出:2
解释:
上图展示了一种可行的矩形放置方案:
- 一个矩形的左下角在
(1, 0)
,右上角在(1, 2)
。 - 一个矩形的左下角在
(2, 0)
,右上角在(2, 3)
。
二. 解题思路
本题的意思也很简单,就是给你一堆坐标和一个w值,让你用宽不超过w的矩形去覆盖这些点,求用到最少的点去完全覆盖所以点,典型的贪心问题,让我们一起来解决:
1. 首先你会发现,本题只限制了矩形的宽,并没有限制长,所以我们不用考虑长。
2. 我们定义一个bound 表示矩形的宽的最后横坐标,即x2,将整个数组进行排序,令 bound 初始值为-1,然后遍历数组,如果当前点的横坐标大于 bound ,说明当前矩阵已经不能包含这个点了,需要另外加一个矩阵(res++)。
3. 在另外加矩阵的时候,我们要使得矩阵容纳的点最多,只需要让矩阵的起始横坐标等于第一个大于 bound 的点的横坐标即可,让矩阵的结束横坐标等于其实横坐标加上w即可(bound) ,然后进行下一次循环即可。
相信你现在非常强大,话不多说!!上代码!!!
三. 代码
class Solution {
public:
int minRectanglesToCoverPoints(vector<vector<int>>& points, int w) {
sort(points.begin(), points.end());
int res = 0;
int bound = -1;
for(auto& p : points){
if(p[0] > bound){
bound = p[0] + w;
res++;
}
}
return res;
}
};
四. 总结
本类题目主要考察对贪心思想的理解和运用,是一道锻炼贪心思想的好题目,建议去练习一下!!
时间复杂度:O(nlogn)。
空间复杂度:O(logn)。