391. 完美矩形
391. 完美矩形
給你一個(gè)數(shù)組 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一個(gè)坐標(biāo)軸平行的矩形。這個(gè)矩形的左下頂點(diǎn)是 (xi, yi) ,右上頂點(diǎn)是 (ai, bi) 。
如果所有矩形一起精確覆蓋了某個(gè)矩形區(qū)域,則返回 true ;否則,返回 false 。
示例 1:
輸入:rectangles = [[1,1,3,3],[3,1,4,2],[3,2,4,4],[1,3,2,4],[2,3,3,4]]
輸出:true
解釋:5 個(gè)矩形一起可以精確地覆蓋一個(gè)矩形區(qū)域。
示例 2:
輸入:rectangles = [[1,1,2,3],[1,3,2,4],[3,1,4,2],[3,2,4,4]]
輸出:false
解釋:兩個(gè)矩形之間有間隔,無法覆蓋成一個(gè)矩形。
示例 3:
輸入:rectangles = [[1,1,3,3],[3,1,4,2],[1,3,2,4],[3,2,4,4]]
輸出:false
解釋:圖形頂端留有空缺,無法覆蓋成一個(gè)矩形。
示例 4:
輸入:rectangles = [[1,1,3,3],[3,1,4,2],[1,3,2,4],[2,2,4,4]]
輸出:false
解釋:因?yàn)橹虚g有相交區(qū)域,雖然形成了矩形,但不是精確覆蓋。
提示:
- 1 <= rectangles.length <= 2 * 10410^4104
- rectangles[i].length == 4
- ?105-10^5?105 <= xi, yi, ai, bi <= 10510^5105
解題思路
首先所有矩形需要組合成一個(gè)大的正常矩形,因此矩形之間不能存在空缺。并且因?yàn)榫匦沃g如果存在相交區(qū)域,雖然形成了矩形,但就不是精確覆蓋了。
因此,在算法中,我們需要統(tǒng)計(jì)每個(gè)小矩形頂點(diǎn)的出現(xiàn)次數(shù)和其面積,只有當(dāng)其滿足上述兩個(gè)條件,才能實(shí)現(xiàn)精準(zhǔn)覆蓋
代碼
typedef pair<int, int> point;class Solution { public:bool isRectangleCover(vector<vector<int>> &rectangles) {map<point, int> m;long long area(0);int min_x1(rectangles[0][0]),min_y1(rectangles[0][1]),max_y2(rectangles[0][3]),max_x2(rectangles[0][2]);for (auto p:rectangles) {int x1 = p[0], y1 = p[1], x2 = p[2], y2 = p[3];min_x1=min(x1,min_x1);min_y1=min(y1,min_y1);max_x2=max(x2,max_x2);max_y2=max(y2,max_y2);m[{x1,y1}]+=1;m[{x1,y2}]+=1;m[{x2,y1}]+=1;m[{x2,y2}]+=1;area+=abs(x1-x2)*abs(y1-y2);}point p1{min_x1,min_y1},p2{min_x1,max_y2},p3{max_x2,min_y1},p4{max_x2,max_y2};if ((long long )abs(min_x1-max_x2)*(long long )abs(max_y2-min_y1)!=area||!m.count(p1)||!m.count(p2)||!m.count(p3)||!m.count(p4))return false;m.erase(p1);m.erase(p2);m.erase(p3);m.erase(p4);for(auto item:m){if (item.second!=2&&item.second!=4)return false;}return true;} }; 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: 梦到身体里有蚂蚁是什么意思
- 下一篇: 2027. 转换字符串的最少操作次数