当前位置: 首页 > news >正文

算法:矩形面积II

题目

给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] = [x1, y1, x2, y2],其中 (xi1, yi1) 是该矩形 左下角 的坐标, (xi2, yi2) 是该矩形 右上角 的坐标。

计算平面中所有 rectangles 所覆盖的 总面积 。任何被两个或多个矩形覆盖的区域应只计算 一次 。

返回 总面积 。因为答案可能太大,返回 109 + 7 的  。

示例 1:

输入:rectangles = [[0,0,2,2],[1,0,2,3],[1,0,3,1]]
输出:6
解释:如图所示,三个矩形覆盖了总面积为 6 的区域。
从(1,1)到(2,2),绿色矩形和红色矩形重叠。
从(1,0)到(2,3),三个矩形都重叠。

题解

解题思路

线性扫描+线段树优化

代码

public class Main15 {int MOD = (int)1e9 + 7;Node root;public int rectangleArea(int[][] rectangles) {//线段树跟节点root = new Node(0, (int)1e9);int[][] lines = new int[rectangles.length * 2][4];// x y1 y2 1/-1//将矩形y轴的两条边映射成线for (int i = 0; i < rectangles.length; i++) {int x1 = rectangles[i][0], y1 = rectangles[i][1], x2 = rectangles[i][2], y2 = rectangles[i][3] - 1;//矩形的左边为1,矩形的右边为-1,操作线段树的时候需要使用lines[i] = new int[] {x1, y1, y2, 1};lines[rectangles.length + i] = new int[] {x2, y1, y2, -1};}//排序保持矩形出现顺序有序,同时报纸同一个矩形的左边在前,右边在后Arrays.sort(lines, (Comparator.comparingInt(o -> o[0])));int pre = lines[0][0];long ans = 0;//扫描所有的线for (int[] line : lines) {//if (line[0] != pre) {//计算矩形面积,root.val表示度,line[0] - pre表示宽度ans = (ans + root.val * (long)(line[0] - pre)) % MOD;pre = line[0];}//更新线段树信息,line[1], line[2]用于计算高度,// line[3]用于表示line[1], line[2]这个高度的矩形是需要计算还是已经计算完成,1需要,-1计算完成update(root, line[1], line[2], line[3]);}return (int)ans;}class Node {int left;int right;int val;int mark;Node leftNode;Node rightNode;public Node(int l, int r) {left = l;right = r;}public Node getLeftNode() {if (leftNode == null) {leftNode = new Node(left, left + (right - left) / 2);}return leftNode;}public Node getRightNode() {if (rightNode == null) {rightNode = new Node(left + (right - left) / 2 + 1, right);}return rightNode;}}/*** 特殊线段树:root.val表示矩形高度,需要计算面积的高度* @param node* @param lo* @param hi* @param val*/public void update(Node node, int lo, int hi, int val) {if (node.left > hi || node.right < lo) {return;}if (node.left >= lo && node.right <= hi) {node.mark += val;} else {update(node.getLeftNode(), lo, hi, val);update(node.getRightNode(), lo, hi, val);}//node.val更新为高度if (node.mark > 0) {node.val = node.right - node.left + 1;} else {//node.mark < 0 表示node.left、node.right表示的高度计算完成//node.mark < 0,则更新待计算的高度为左右两个子节点的高度和node.val = node.getLeftNode().val + node.getRightNode().val;}}
}

http://www.dtcms.com/a/533681.html

相关文章:

  • app怎么查网站备案计算机网站php设计代做
  • 晋中公司做网站装修效果图软件app哪个好
  • yum安装配置
  • 网站标题算关键词优化吗吴忠北京网站建设
  • 做ps网页设计的网站有哪些wordpress配置文件路径
  • 笔试强训(九)
  • 线程池ThreadPoolExecutor
  • 合同的系统培训约定
  • cf租号网站怎么做的河南建设安全协会网站
  • 建设的网站别人登录密码公司企业邮箱号
  • 电商网站怎样做天津网站建设哪个好
  • 长沙网站建设接单wordpress站点名没有更改
  • 手机wap网站建设一套完整的app 开发流程
  • 在线制作wap网站中牟建设工程信息网站
  • K8S--标签(labels)和选择器(selectors)的作用
  • G1 垃圾收集器
  • 湛江免费建站公司磁力在线搜索引擎
  • 广东省城乡建设厅网站首页如何判断网站有cdn加速
  • Bugku-Web题目-no select
  • 健康门户网站建设内容求职网站开发
  • Linux 信号处理视角下的 volatile 关键字
  • 广告文案优秀网站网络推广营销方式
  • 增城高端定制网站建设网站建设全域云
  • 小型深圳网站页面设计网页制作基础教程代码
  • 周学习记录
  • 建设网站职业证书查询wordpress菜单前面加图标
  • 南昌网站建设服务平台兰州网站设计公司
  • 河南网站建设公司价格wordpress 引导页
  • C-文件操作
  • 【第一章】基于Simulink的控制器开发教程——目录