力扣刷题日记-面试题 391. 完美矩形

70 阅读2分钟

又来刷题了 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;
	}

}