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

C语言 | Leetcode C语言题解之第391题完美矩形

题目:

题解:

/* 参照官方答案题解:
1.小矩形面积之和等于大矩形区域面积
2.矩形区域内部顶点出现次数只能是2次或4次(边界四个顶点只能出现一次)
*/
typedef struct {int x;int y;
} Coordinate;typedef struct {Coordinate pos;int cnt;UT_hash_handle hh;
} CoordRecord;CoordRecord *FindNode(CoordRecord **root, int x, int y)
{Coordinate tmp = {.x = x,.y = y};CoordRecord *ptr = NULL;HASH_FIND(hh, *root, &tmp, sizeof(Coordinate), ptr);return ptr;
}void AddNode(CoordRecord **root, int x, int y)
{CoordRecord *ptr = FindNode(root, x, y);if (ptr == NULL) {CoordRecord *rec = (CoordRecord*)malloc(sizeof(CoordRecord));rec->cnt = 1;rec->pos.x = x;rec->pos.y = y;HASH_ADD(hh, *root, pos, sizeof(Coordinate), rec);} else {(ptr->cnt)++;}
}bool isRectangleCover(int** rectangles, int rectanglesSize, int* rectanglesColSize){CoordRecord *root = NULL;int minx = INT_MAX;int miny = INT_MAX;int maxa = 0;int maxb = 0;int area = 0;for (int i = 0; i < rectanglesSize; ++i) {int x = rectangles[i][0];int y = rectangles[i][1];int a = rectangles[i][2];int b = rectangles[i][3];/* 计算每个小矩形的面积之和 */area += (a - x) * (b - y);/* 为最后求大矩形面积做准备 */minx = fmin(minx, x);miny = fmin(miny, y);maxa = fmax(maxa, a);maxb = fmax(maxb, b);/* 统计每个顶点出现的次数 */AddNode(&root, x, y);AddNode(&root, x, b);AddNode(&root, a, y);AddNode(&root, a, b);}/* 面积之和不相等,则返回false */if ((maxa - minx) * (maxb - miny) != area) {return false;}/* 判断每个顶点出现的次数 */HASH_ITER(hh, root, node, p) {// 左边界两个顶点if ((node->pos.x == minx) && (node->pos.y == miny || node->pos.y == maxb)) {if (node->cnt != 1) {return false;}// 右边界两个顶点} else if ((node->pos.x == maxa) && (node->pos.y == miny || node->pos.y == maxb)) {if (node->cnt != 1) {return false;}// 内部顶点} else {if (node->cnt % 2) {return false;}}}/* 释放hash表 */HASH_ITER(hh, root, node, p) {HASH_DEL(root, node);free(node);}return true;
}

http://www.mrgr.cn/news/21850.html

相关文章:

  • windows版本mysql8.2忘记密码
  • C/C++ 网络聊天室在线聊天系统(整理重传)
  • PromQL 语法
  • UML的图及其他图补充
  • App Store最低版本要求汇总
  • Nacos Config 配置中心支持配置共享
  • 代码编译过程详细解释
  • 9.8通宵速通javascript
  • 字符串中第一个唯一字符
  • 【编程底层原理】方法区、永久代和元空间之间的关系
  • 在Debian 8上安装Node.js的方法
  • 六、Maven依赖管理、依赖传递和依赖冲突
  • 漫谈设计模式 [1]:简单工厂模式
  • 机械学习—零基础学习日志(概率论总笔记5)
  • Java 中的数组是如何声明和初始化的?
  • 解决面板安装Node.js和npm后无法使用的问题
  • 【详解 Java 注解】
  • java8 Stream流详解
  • STM32G474内部温度传感器的使用
  • linux高级学习10