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

LeetCode 939. Minimum Area Rectangle

方法一:Sort By Column 

先Group by column,并排序。对于每个col,枚举所有的(r1, r2) pair,把pair作为key,col作为value保存到map,即 map[{r1,r2}] = col。如果之后再遍历到同样的pair,说明可以形成一个长方形。

需要注意的是,如果要用unordered_map且用pair作为key的话,需要写hash function来hash。

How to create an unordered_map of pairs in C++?

方便起见可以牺牲一点时间复杂度用map。还有一种解决方法是避免用pair作为key:由于本题给了数据范围,可以用 40001*x+y 来encode坐标。

class Solution {
public:
    int minAreaRect(vector<vector<int>>& points) {
        map<int,vector<int>> m; // col -> group of row with this col 
        for (auto point:points){
            int c=point[0], r=point[1];
            m[c].push_back(r);
        }
        int min_area=INT_MAX;
        map<pair<int,int>,int> last_col; // (r1,r2) -> the last column they are in
        for (auto it=m.begin();it!=m.end();++it){
            int c=it->first;
            vector<int> &vec=it->second;
            sort(vec.begin(),vec.end());
            for (int i=0;i<vec.size();++i){
                for (int j=i+1;j<vec.size();++j){
                    int r1=vec[i], r2=vec[j];
                    if (last_col.count({r1,r2})){
                        min_area = min(min_area, (c-last_col[{r1,r2}])*(r2-r1) );
                    }
                    last_col[{r1,r2}] = c;
                }
            }
        }
        return min_area<INT_MAX?min_area:0;
    }
};
 时间复杂度:O(n^3) [last_col用unordered_map的情况]

还有别的类似的做法,如首先 group by col,枚举一对col作为矩形边界(两者间的距离为长),然后two pointer找最短的宽。时间复杂度也是 O(n^3)。

 

方法二:Count by Diagonal

首先将所有点放到hashtable里。枚举一对点作为长方形的对角的两个点,这样另外两个定点的坐标也确定了下来。我们只需要检查这两个点在不在hashtable里即可。这里的问题和上面一样,pair做key的问题。

以下方法思路类似,但可以避免用pair做key。

class Solution {
public:
    int minAreaRect(vector<vector<int>>& points) {
        map<int,unordered_set<int>> m; // col -> group of row with this col
        for (auto point:points){
            m[point[0]].insert(point[1]);
        }
        int min_area=INT_MAX;
        for (int i=0;i<points.size();++i){
            for (int j=i+1;j<points.size();++j){
                int c1=points[i][0], r1=points[i][1];
                int c2=points[j][0], r2=points[j][1];
                if (c1==c2 || r1==r2) continue;
                if (m[c1].count(r2) && m[c2].count(r1)){
                    min_area = min(min_area, abs(r1-r2)*abs(c1-c2));
                }
            }
        }
        return min_area<INT_MAX?min_area:0;
    }
};

时间复杂度:O(n^2)

转载于:https://www.cnblogs.com/hankunyan/p/11051517.html

相关文章:

  • js实现天小时分钟秒倒计时
  • Mahout 中基于SVD 的协同过滤原理
  • 抽屉原理
  • Flexigrid自定义显示数据列
  • parseInt()
  • SQL SERVER 2000数据库置疑处理
  • 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-4.Action Bar)...
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • vue组件之间的传值
  • 『Python基础』第二节: Python简介及入门
  • 统一ID服务
  • 小小c#算法题 - 5 - 插入排序
  • 线程启动 [转]
  • PSP Skype 使用国内卡
  • php.ini 中文版[转]
  • JavaScript 基本功--面试宝典
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Javascript编码规范
  • Java方法详解
  • Kibana配置logstash,报表一体化
  • Rancher如何对接Ceph-RBD块存储
  • react 代码优化(一) ——事件处理
  • webpack4 一点通
  • 浮现式设计
  • 关于for循环的简单归纳
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 排序算法学习笔记
  • 前端面试之CSS3新特性
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 数据仓库的几种建模方法
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一天一个设计模式之JS实现——适配器模式
  • Java总结 - String - 这篇请使劲喷我
  • #Spring-boot高级
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (6)STL算法之转换
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (利用IDEA+Maven)定制属于自己的jar包
  • (五)c52学习之旅-静态数码管
  • (一)插入排序
  • (转)ABI是什么
  • (转)一些感悟
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET导入Excel数据
  • /boot 内存空间不够
  • @angular/cli项目构建--Dynamic.Form
  • @Autowired标签与 @Resource标签 的区别
  • @SentinelResource详解
  • @Transaction注解失效的几种场景(附有示例代码)
  • @vue/cli脚手架
  • [ C++ ] STL---stack与queue