Problem: 3025. 人员站位的方案数 I

思路:

想了好久,发现最后挺简单的。如图。当以1作为左端点时,如果右端点大于左端点的值,说明不满足A 在 B 的左上角条件,直接跳过此次循环。如果右端点的值小于等于左端点,判断右端点是否大于记录的最大值,如果大于,例如点3,说明左、右端点构成的矩形中没有其他点,更新最大值,ans++。

难点:当满足A 在 B 的左上角时才更新最大值。这样就能确保最大值永远在左端点高度之下(或者平齐),换句话说,该最大值是以左端点为左上角的矩形范围内的最大值,后面每次右端点进入的时候,只需要比较右端点和最大值即可。

img

复杂度

  • 时间复杂度: O(n^2)
  • 空间复杂度: O(1)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int numberOfPairs(int[][] points) {
int n = points.length;
Arrays.sort(points, (a, b) -> a[0] == b[0] ? b[1] - a[1] : a[0] - b[0]);

int ans = 0;

for (int i = 0; i < n; i ++) {
int maxv = Integer.MIN_VALUE;
for (int j = i + 1; j < n; j ++) {
if (points[j][1] > points[i][1]) {
continue;
}
if (points[j][1] > maxv) {
maxv = points[j][1];
ans ++;
}
}
}
return ans;
}
}