又来刷题了 java版本和js版本全部上齐
js版本:
/**
* @param {number[][]} rectangles
* @return {boolean}
*/
var isRectangleCover = function(rectangles) {
if(rectangles.length === 0) { // 矩形数组为空,直接跳出,判定为false
return false
}
// 首先定义最左、最右、最下、最上,四条边的值
let l = Infinity;
let r = -Infinity;
let d = Infinity;
let u = -Infinity;
let map = new Map();// 用来收集点,想象以x轴,很多条竖线,每条线上的点收集起来.
let area = 0;// 用来抓去矩形面积
for(let rect of rectangles) {
// 将矩形的在同一条垂直线上的点收集起来
add(map, rect[0], rect[1]);
add(map, rect[0], rect[3]);
add(map, rect[2], rect[1]);
add(map, rect[2], rect[3]);
// 矩形面积总和
area += (rect[2] - rect[0]) * (rect[3] - rect[1]);
// 四个顶点差值求面积
l = Math.min(rect[0], l);// 最左边
r = Math.max(rect[2], r);// 最右边
d = Math.min(rect[1], d);// 最下边
u = Math.max(rect[3], u);// 最上边
}
// 四个点只出现一次、其余的点都出现偶数次,并且所有的小矩形加起来的面积等于大矩形的面积,那么就是完美矩形
return checkPoint(map,l,d,r,u) && area == (r - l) * (u - d);
};
function add (map, row, col) {
if(!map.has(row)) {
map.set(row, new Map())
}
map.get(row).set(col,map.get(row).get(col)? map.get(row).get(col) + 1 : 1);
}
function checkPoint(map, l,d,r,u) {
if(map.get(l).get(d) != 1
|| map.get(l).get(u) != 1
|| map.get(r).get(d) != 1
|| map.get(r).get(u) != 1) {
return false;
}
map.get(l).delete(d);
map.get(l).delete(u);
map.get(r).delete(d);
map.get(r).delete(u);
console.log(map)
for(let key of map.entries()) {
console.log(key)
for(let value of map.get(key[0]).values()) {
if((value & 1) != 0) { // (value & 1) != 0 说明有点出现了奇数,那么直接返回false,因为有点出现奇数次,有面积重叠,那么不是完美矩形了 (value & 1) == 0 说明value是偶数 (value & 1) != 0 说明value是奇数
return false;
}
}
}
return true;
}
java版本
package class46;
import java.util.HashMap;
public class Problem_0391_PerfectRectangle {
public static boolean isRectangleCover(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int l = Integer.MAX_VALUE;
int r = Integer.MIN_VALUE;
int d = Integer.MAX_VALUE;
int u = Integer.MIN_VALUE;
HashMap<Integer, HashMap<Integer, Integer>> map = new HashMap<>();
int area = 0;
for (int[] rect : matrix) {
add(map, rect[0], rect[1]);
add(map, rect[0], rect[3]);
add(map, rect[2], rect[1]);
add(map, rect[2], rect[3]);
area += (rect[2] - rect[0]) * (rect[3] - rect[1]);
l = Math.min(rect[0], l);
d = Math.min(rect[1], d);
r = Math.max(rect[2], r);
u = Math.max(rect[3], u);
}
return checkPoints(map, l, d, r, u) && area == (r - l) * (u - d);
}
public static void add(HashMap<Integer, HashMap<Integer, Integer>> map, int row, int col) {
if (!map.containsKey(row)) {
map.put(row, new HashMap<>());
}
map.get(row).put(col, map.get(row).getOrDefault(col, 0) + 1);
}
public static boolean checkPoints(HashMap<Integer, HashMap<Integer, Integer>> map, int l, int d, int r, int u) {
if (map.get(l).getOrDefault(d, 0) != 1
|| map.get(l).getOrDefault(u, 0) != 1
|| map.get(r).getOrDefault(d, 0) != 1
|| map.get(r).getOrDefault(u, 0) != 1) {
return false;
}
map.get(l).remove(d);
map.get(l).remove(u);
map.get(r).remove(d);
map.get(r).remove(u);
for (int key : map.keySet()) {
for (int value : map.get(key).values()) {
if ((value & 1) != 0) {
return false;
}
}
}
return true;
}
}