1725. 可以形成最大正方形的矩形数目
贪心
贪心
非常简单,先找到最大的正方形边长,再在数组中找到符合的长方形数量。
class Solution {
public int countGoodRectangles(int[][] rectangles) {
int ml = 0;
for(int [] rectangle : rectangles) {
ml = Math.max(ml, Math.min(rectangle[0], rectangle[1]));
}
int res = 0;
for(int [] rectangle : rectangles) {
if(rectangle[0] >= ml && rectangle[1] >= ml) res ++;
}
return res;
}
}
#### 贪心优化
可以认作当前的长方形短边就是构成最大正方形的边长a
,然后再往后遍历,如果有比a
大的b
,那么之前最大边长的矩形一定构成不了最大正方形,证明就是:a
< b
。直接遍历一遍即可。
class Solution {
public int countGoodRectangles(int[][] rectangles) {
int ml = 0, res = 0;
for (int[] rectangle : rectangles) {
int cur = Math.min(rectangle[0], rectangle[1]);
if (cur == ml) res++;
else if (cur > ml) {
ml = cur;
res = 1;
}
}
return res;
}
}
TreeMap排序
跟上面的逻辑一样,只是把非最大边长的其他正方形保存了下来,可以说是一种炫技手段。
class Solution {
public int countGoodRectangles(int[][] rectangles) {
TreeMap<Integer, Integer> treeMap = new TreeMap((a, b) -> (int)b - (int)a);
for (int i = 0; i < rectangles.length; i++) {
int min = Math.min(rectangles[i][0], rectangles[i][1]);
treeMap.put(min, treeMap.getOrDefault(min, 0) + 1);
}
return treeMap.firstEntry().getValue();
}
}