[LeetCode]--223. Rectangle Area

Find the total area covered by two rectilinear rectangles in a 2D plane.

Each rectangle is defined by its bottom left corner and top right corner as shown in the figure.

Rectangle Area
Assume that the total area is never beyond the maximum possible value of int.

Assume that the total area is never beyond the maximum possible value of int.

Credits:
Special thanks to @mithmatt for adding this problem, creating the above image and all test cases.

这个题目重点就是要很精巧的处理好重叠的问题。

public int computeArea(int A, int B, int C, int D, int E, int F, int G,
            int H) {
        int area1 = (C - A) * (D - B);
        int area2 = (G - E) * (H - F);

        int overlapRegion = overlap(A, B, C, D, E, F, G, H);
        return area1 + area2 - overlapRegion;
    }

    private int overlap(int A, int B, int C, int D, int E, int F, int G, int H) {
        int h1 = Math.max(A, E);
        int h2 = Math.min(C, G);
        int h = h2 - h1;

        int v1 = Math.max(B, F);
        int v2 = Math.min(D, H);
        int v = v2 - v1;

        if (h <= 0 || v <= 0)
            return 0;
        else
            return h * v;
    }

别高兴太早哈,这个是不能Accept的,因为在这个测试案例(-1500000001, 0,
-1500000000, 1, 1500000000, 0, 1500000001, 1)
我Debug了一下,是int超出了范围。

public int computeArea(int A, int B, int C, int D, int E, int F, int G,
            int H) {
        int area1 = (C - A) * (D - B);
        int area2 = (G - E) * (H - F);

        int overlapRegion = overlap(A, B, C, D, E, F, G, H);
        return area1 + area2 - overlapRegion;
    }

    private int overlap(int A, int B, int C, int D, int E, int F, int G, int H) {
        // int h1 = Math.max(A, E);
        // int h2 = Math.min(C, G);
        // int h = h2 - h1;
        int h = Math.max(A, E) - Math.min(C, G);

        // int v1 = Math.max(B, F);
        // int v2 = Math.min(D, H);
        // int v = v2 - v1;
        int v = Math.max(B, F) - Math.min(D, H);

        if (h <= 0 || v <= 0)
            return 0;
        else
            return h * v;
    }

还有一种比较好的算法:

public int computeArea2(int A, int B, int C, int D, int E, int F, int G,
            int H) {
        int val = (C - A) * (D - B) + (G - E) * (H - F);
        if (E > C || G < A || F > D || H < B) {
            return val;
        }
        val -= (Math.min(C, G) - Math.max(A, E))
                * (Math.min(D, H) - Math.max(B, F));
        return val;
    }
时间: 2024-10-04 00:31:30

[LeetCode]--223. Rectangle Area的相关文章

[LeetCode] Rectangle Area

Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined by its bottom left corner and top right corner as shown in the figure. Assume that the total area is never beyond the maximum possible value of int. 解题

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

canvas中的碰撞检测笔记

canvas中的碰撞检测笔记 时间 2016-01-19 08:29:00  博客园精华区 原文  http://www.cnblogs.com/zichi/p/5141044.html 主题 Canvas 用 canvas 做小游戏或者特效,碰撞检测是少不了的.本文将会涉及普通的碰撞检测,以及像素级的碰撞检测.(本文的碰撞检测均以 矩形 为例)  普通碰撞检测 普通的矩形碰撞检测比较简单.即已知两个矩形的各顶点坐标,判断是否相交,如相交,则为碰撞. leetcode 有道题是给出两个矩形的坐标

c++-为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的

问题描述 为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的 #include using namespace std; class rectangle { protected: double length,width,l,w; public: void setlength(); void getlength(); void setwidth(); void getwidth(); double area(); double perimeter(); dou

C#模仿QQ截图功能

前阵子改了段C#截图功能的代码,现贴上来希望对大家有用 主文件 CaptureScreenForm.cs using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.Runtime.InteropServices; namespace CaptureScreen{ //

拖放 DataGrid 列--来自MSDN

datagrid 摘要:了解如何利用基本的 GDI 功能,从而通过 DataGrid 控件获得可视化效果.通过跨越托管边界进行调用,可以利用本机 GDI 功能来执行屏幕捕获,并最终获得拖放体验. 下载 ColumnDragDataGrid.msi 文件. 本页内容 简介 入门 ScreenImage 类 DraggedDataGridColumn 类 ColumnDragDataGrid 类 列跟踪 重写 DataGrid 的 OnPaint 方法 小结 简介几个月以前,当我初到 Microso

Ruby的变量与赋值简析

变量与赋值 至此,你是否注意到前面所有的示例代码中都缺少某种东西?难道你必须输入常数,实例变量或类变量?绝对不是!这正是Ruby的真正面向对象的天性的一部分.为此,首先让我们看一下Ruby中以前的普通变量.至此,你已经创建了很多Rectangle实例,但是你并没有把它们保留多长时间.比方说,你想要把一个变量赋值给你创建的一个Rectangle实例: myRectangle=Rectangle.new(4,5) 在Ruby中这是完全有效的代码,而且根本不需要另一行代码来把myRectangle类型

Java实现类MSN、QQ好友上线通知界面

相信大家都使用过MSN,QQ这样的即时聊天类软件,对于它们的好友上线提示功能并不陌生吧?从屏幕右下角弹出一个小界面,慢慢上升,最后消失.我们能不能在自已的程序中也做出相同的功能呢?能!笔者现用JAVA和eclipse的SWT用户界面组件实现这个功能. 什么是SWT呢? SWT原来是eclipse项目组为开发eclipse IDE所编写的图形界面API,运行时,其先判断本机是否有相同的界面元素,如果有则直接调用显示,如没有才进行模拟显示.其运行机制使速度比AWT,SWING快很多. 了解更多请看:

使用分层画布来优化HTML5渲染的教程

  简介 通常情况下,在玩 2D 游戏或渲染 HTML5 画布时,需要执行优化,以便使用多个层来构建一个合成的场景.在 OpenGL 或 WebGL 等低级别渲染中,通过逐帧地清理和绘制场景来执行渲染.实现渲染之后,需要优化游戏,以减少渲染的量,所需成本因情况而异.因为画布是一个 DOM 元素,它使您能够对多个画布进行分层,以此作为一种优化方法. 常用的缩写 CSS: Cascading Style Sheets(级联样式表) DOM: Document Object Model(文档对象模型)