每日一题Day162LC1637两点之间不包含任何点的最宽垂直区域 | 排序
Posted TIkitianya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题Day162LC1637两点之间不包含任何点的最宽垂直区域 | 排序相关的知识,希望对你有一定的参考价值。
两点之间不包含任何点的最宽垂直区域【LC1637】
给你
n
个二维平面上的点points
,其中points[i] = [xi, yi]
,请你返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。垂直区域 的定义是固定宽度,而 y 轴上无限延伸的一块区域(也就是高度为无穷大)。 最宽垂直区域 为宽度最大的一个垂直区域。
请注意,垂直区域 边上 的点 不在 区域内。
真就阅读理解题
-
思路:排序
由于所求区域内不能包含其他点,因此可以将
points
根据x
升序排序,那么最终结果为相邻两点宽度差值的最大值 -
实现
class Solution public int maxWidthOfVerticalArea(int[][] points) Arrays.sort(points, (p1, p2) -> p1[0] - p2[0]); int n = points.length; int res = 0; for (int i = 1; i < n; i++) res = Math.max(res, points[i][0] - points[i - 1][0]); return res;
-
复杂度
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
- 空间复杂度: O ( l o g n ) O(logn) O(logn)
-
每日一题27. 过河 (DP + 离散化)
补题链接:Here
算法涉及:DP + 离散化
\\(l\\) 的范围太大,无法作为数组下标,所以先离散化,再DP。两点间的距离d大于t时,一定可以由 \\(d\\ \\%\\ t\\) 跳过来,所以最多只需要t+d%t种距离的状态就可以表示这两个石子之间的任意距离关系。这样就把题目中的 \\(10^9\\) 压缩成了\\(2*t*m\\) 最多不超过 \\(2000\\) ,然后就可以放心大胆地用DP了。不过要注意题目中的“当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥”,所以DP的终点是一个范围而非确切的一个点,最后还要在这个范围内取最小值。
using ll = long long;
const int N = 1e6 + 10;
const ll inf = 0x3f3f3f3f;
ll dp[N], a[N], vis[N];
void solve() {
int l, s, t, m;
cin >> l >> s >> t >> m;
for (int i = 1; i <= m; ++i)cin >> a[i];
sort(a + 1, a + 1 + m);
a[0] = 0, a[m + 1] = l;
int tmp = 0;
for (int i = 1; i <= m + 1; ++i) {
//这里一定要在取模后加t,否则会WA
if (a[i] - a[i - 1] > t)tmp += (a[i] - a[i - 1]) % t + t;
else tmp += a[i] - a[i - 1];
vis[tmp] = 1; //表示此处有石子
}
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
for (int i = 1; i <= tmp + 100; ++i)
for (int j = s; j <= t; ++j)
if (i >= j)dp[i] = min(dp[i], dp[i - j] + vis[i]);
ll ans = inf;
//终点可能的范围,稍微写大点·
for (int i = tmp; i <= tmp + 100; ++i)
ans = min(ans, dp[i]);
cout << ans;
}
以上是关于每日一题Day162LC1637两点之间不包含任何点的最宽垂直区域 | 排序的主要内容,如果未能解决你的问题,请参考以下文章
算法1637. 两点之间不包含任何点的最宽垂直面积(多语言实现)
每日一题Day154LC1626无矛盾的最佳球队 | 动态规划