给你 n 个二维平面上的点 points ,其中 points[i] = [xi, yi] ,请你返回两点之间内部不包含任何点的 最宽垂直面积 的宽度。
垂直面积 的定义是固定宽度,而 y 轴上无限延伸的一块区域(也就是高度为无穷大)。 最宽垂直面积 为宽度最大的一个垂直面积。
请注意,垂直区域 边上 的点 不在 区域内。
示例 1:
输入:points = [[8,7],[9,9],[7,4],[9,7]]
输出:1
解释:红色区域和蓝色区域都是最优区域。
示例 2:
输入:points = [[3,1],[9,0],[1,0],[1,4],[5,3],[8,8]]
输出:3
只用将x的坐标排序算最大差值即可。
写了个简单的归并排序(没有优化):
#include
#include
using namespace std;
class Solution {
public:
int maxWidthOfVerticalArea(vector>& points) {
vector arr;
vector res;
for (int i = 0; i < points.size(); i++) {
arr.push_back(points[i][0]);
}
res = mergesort(arr, 0, arr.size() - 1);
for (int i = 1; i < res.size(); i++) {
getMaxWide(res[i], res[i - 1]);
}
return maxVal;
}
void getMaxWide(int a, int b) {
if ((a - b) > maxVal) {
maxVal = a - b;
}
}
public:
vector merge(vector& A, vector& B) {
vector arr(A.size() + B.size(), 0);
int index1 = 0;
int index2 = 0;
while (index1 < A.size() && index2 < B.size()) {
if (A[index1] < B[index2]) {
arr[index1 + index2] = A[index1];
index1++;
}
else {
arr[index1 + index2] = B[index2];
index2++;
}
}
while (index1 < A.size()) {
arr[index1 + index2] = A[index1];
index1++;
}
while (index2 < B.size()) {
arr[index1 + index2] = B[index2];
index2++;
}
return arr;
}
vector mergesort(vector& arr, int start, int end) {
if (start == end) {
vector val(1, 0);
val[0] = arr[start];
return val;
}
int mid = (start + end) / 2;
vectorLeft = mergesort(arr, start, mid);
vectorRight = mergesort(arr, mid + 1, end);
return merge(Left, Right);
}
private:
int maxVal;
};
int main() {
vector> points = { {3,1 }, { 9,0 }, { 1,0 }, { 1,4 }, { 5,3 }, { 8,8 } };
vector val = { 9,10,2,3,1,34,12,43,6,2,5 };
Solution* ps = new Solution();
vectorres = ps->mergesort(val, 0, val.size() - 1);
for (int i = 0; i < res.size(); i++) {
cout << res[i] << endl;
}
cout << ps->maxWidthOfVerticalArea(points) << endl;
return 0;
}