• 391. Perfect Rectangle


    最后更新

    一刷
    16-Jan-2017

    这个题我甚至不知道该怎么总结。

    难就难在从这个题抽象出一种解法,看了别人的答案和思路= =然而没有归类总结到某种类型,这题相当于背了个题。。。

    简单的说,除了最外面的4个点,所有的点都会2次2次的出现,如果有覆盖,覆盖进去的点就不是成对出现了。

    最外面4个点围的面积等于所有小矩形面积的和。

    就用这2个判断就行了。

    判断成对的点用的SET,单次出现添加,第二次出现删除。。这样最后应该都删掉,SET里只剩下4个最外面的点。

    剩下的就是判断最外点,不停地更新。。

    public class Solution {
        public boolean isRectangleCover(int[][] rectangles) {
            if (rectangles.length == 0) return true;
            
            int left = Integer.MAX_VALUE;
            int bot = Integer.MAX_VALUE;
            int right = Integer.MIN_VALUE;
            int top = Integer.MIN_VALUE;
            Set<Integer> set = new HashSet<>();
            int tempArea = 0;
            
            for (int[] nums : rectangles) {
                // bot left top right
                bot = Math.min(bot, nums[0]);
                left = Math.min(left, nums[1]);
                top = Math.max(top, nums[2]);
                right = Math.max(right, nums[3]);
                
                tempArea += (nums[2] - nums[0]) * (nums[3] - nums[1]);
                int bottomLeft = 10 * nums[0] + nums[1];
                int topRight = 10 * nums[2] + nums[3];
                int bottomRight = 10 * nums[0] + nums[3];
                int topLeft = 10 * nums[2] + nums[1];
                
                if (set.contains(bottomLeft)) set.remove(bottomLeft);
                else set.add(bottomLeft);
                
                if (set.contains(topRight)) set.remove(topRight);
                else set.add(topRight);
                
                if (set.contains(bottomRight)) set.remove(bottomRight);
                else set.add(bottomRight);
                
                if (set.contains(topLeft)) set.remove(topLeft);
                else set.add(topLeft);
            }
            int bottomLeft = 10 * bot + left;
            int topRight = 10 * top + right;
            int bottomRight = 10 * bot + right;
            int topLeft = 10 * top + left;
            int maxArea = (right - left) * (top - bot);
            
            if(set.size() == 4 && set.contains(bottomLeft) && set.contains(topRight) 
                               && set.contains(bottomRight) && set.contains(topLeft)) {
                return maxArea == tempArea;                           
            } else {
                return false;
            }
        }
    }
    
  • 相关阅读:
    hdu4597 Play Game DP
    poj2253 Frogger Dijkstra变形
    poj1797 Heavy Transportation Dijkstra算法的简单应用
    49.将手机收藏信息保存到文件中
    48.XML保存衣服尺码信息
    47.多客户端用户登录
    46. 模拟用户登录的功能
    45.客户咨询问题
    44. 客户端发送信息给服务器端
    43.创建线程的两种方法
  • 原文地址:https://www.cnblogs.com/reboot329/p/6291623.html
Copyright © 2020-2023  润新知