本文共 2119 字,大约阅读时间需要 7 分钟。
function isPerfectRectangle(matrix) { if (!matrix.length || !matrix[0].length) { return false } let left = Infinity let right = -Infinity let top = -Infinity let bottom = Infinity let area = 0 let set = new Set() matrix.forEach(rect => { left = Math.min(left, rect[0]) right = Math.max(right, rect[2]) top = Math.max(top, rect[3]) bottom = Math.min(bottom, rect[1]) area += (rect[2] - rect[0]) * (rect[3] - rect[1]) // 用数组表示顶点不是挺好,为什么要join成字符串呢? // 因为数组是引用类型,即使set里边有一个点[1,3],用has判断set里边是否有[1,3]还是会返回false // 这个时候就不会将set里边已经存在的那个点删除掉,而是再次add一个相同的点 // 当然,再次add也没有作用,但是也不会报错 let left_top = [rect[0], rect[3]].join('_') let left_bottom = [rect[0], rect[1]].join('_') let right_top = [rect[2], rect[3]].join('_') let right_bottom = [rect[2], rect[1]].join('_') if (set.has(left_top)) { set.delete(left_top) } else { set.add(left_top) } if (set.has(left_bottom)) { set.delete(left_bottom) } else { set.add(left_bottom) } if (set.has(right_top)) { set.delete(right_top) } else { set.add(right_top) } if (set.has(right_bottom)) { set.delete(right_bottom) } else { set.add(right_bottom) } }); // 如果最终set里边不是仅仅包含最终的大矩形的4个顶点,那么一定不能完美拼成矩形,返回false if (!set.has([left, top].join('_')) || !set.has([left, top].join('_')) || !set.has([left, top].join('_')) || !set.has([left, top].join('_')) || set.size !== 4) { return false } // 这个地方一定不能直接返回true,除了满足上面的条件,所有的小矩形的面积加起来等于最终的大矩形的面积时,才能说明可以完美拼成矩形,可以参考我给出的matrix3画图看看就明白了 return area === (right - left) * (top - bottom)}let matrix = [ [1, 1, 3, 3], [3, 1, 4, 2], [1, 3, 2, 4], [3, 2, 4, 4],];let matrix2 = [ [1, 1, 3, 3], [3, 1, 4, 2], [1, 3, 3, 4], [3, 2, 4, 4],];let matrix3 = [ [0, 0, 3, 3], [1, 0, 4, 3], [0, 1, 3, 4], [1, 1, 4, 4], [1, 1, 3, 3], [0, 1, 4, 3], [1, 0, 3, 4],]console.log(isPerfectRectangle(matrix3))
转载地址:http://ktdqi.baihongyu.com/