LeetCode 850 题解

https://leetcode.com/problems/rectangle-area-ii/description/

题目大意:给你每个矩形的左下角和右上角的坐标,问最终图形的面积。

解题思路:这道题的solution写的好。。https://leetcode.com/problems/rectangle-area-ii/solution/

我按照solution2 抄的,解法是n^3的解法不是很优秀,思路是将坐标映射缩小范围,然后暴力标记,之后映射回去计算面积。

class Solution {
    public int rectangleArea(int[][] rectangles) {
        int n = rectangles.length;
        Set<Integer> xSet = new HashSet<>();
        Set<Integer> ySet = new HashSet<>();
        for (int[] r : rectangles) {
            xSet.add(r[0]);
            xSet.add(r[2]);
            ySet.add(r[1]);
            ySet.add(r[3]);
        }
        Integer[] x = xSet.toArray(new Integer[0]);
        Arrays.sort(x);
        Integer[] y = ySet.toArray(new Integer[0]);
        Arrays.sort(y);
        System.out.println(x.length+" "+y.length);
        HashMap<Integer, Integer> xMap = new HashMap<>();
        HashMap<Integer, Integer> yMap = new HashMap<>();
        for (int i = 0; i < x.length; i++)
            xMap.put(x[i], i);
        for (int i = 0; i < y.length; i++)
            yMap.put(y[i], i);
        boolean[][] grid = new boolean[x.length][y.length];
        for (int[] r:rectangles)
        {
            for(int i = xMap.get(r[0]);i<xMap.get(r[2]);i++)
            {
                for(int j=yMap.get(r[1]);j<yMap.get(r[3]);j++)
                {
                    grid[i][j] =true;
                }
            }
        }
        /*
        for(int i=0;i<grid.length;i++)
        {
            for(int j=0;j<grid[0].length;j++)
            {
                if(grid[i][j]) System.out.print(1);
                else System.out.print(0);
            }
            System.out.println();
        }*/

        long res=0;
        for(int i=0;i<grid.length;i++)
        {
            for(int j=0;j<grid[0].length;j++)
            {
                if(grid[i][j]) {
                    res = res + (long) (x[i + 1] - x[i]) * (y[j + 1] - y[j]);
                    res = res % 1_000_000_007 ;
                }
            }
        }
        res = res % 1_000_000_007 ;
        return (int)res ;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值