【Leetcode】963. Minimum Area Rectangle II

该博客讨论了一个算法问题,即在给定的二维平面上的整数点集中找到能构成矩形的四点组合,以求出最小的矩形面积。通过将边视为对角线并按中点和长度分类,博主提出了一种O(n^2 + ∑ei^2)时间复杂度和O(n^2)空间复杂度的解决方案。算法涉及排序、查找和矩形面积计算,旨在解决几何计算和数据结构优化的问题。
摘要由CSDN通过智能技术生成

题目地址:

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

给定平面直角坐标系的 n n n个点,题目保证这 n n n个点都是整点并且各不相同。可以任意挑 4 4 4个能组成矩形的点,问这些矩形的面积最小值。如果不存在任何矩形则返回 0 0 0

可以先将 n ( n − 1 ) / 2 n(n-1)/2 n(n1)/2条边构造出来,将它们视为对角线,那么能组成矩形的对角线必须满足中点重合并且长度相等。那么按照中点和长度将所有对角线分类,矩形只会在某一类对角线内部产生。直接枚举即可。代码如下:

class Solution {
 public:
  long get_dist(vector<int>& a, vector<int>& b) {
    long dx = a[0] - b[0], dy = a[1] - b[1];
    return dx * dx + dy * dy;
  }

  double minAreaFreeRect(vector<vector<int>>& p) {
    int n = p.size();
    vector<vector<long>> v;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < i; j++) {
        long x1 = p[i][0], y1 = p[i][1], x2 = p[j][0], y2 = p[j][1];
        long cx = x1 + x2, cy = y1 + y2;
        v.push_back({cx, cy, get_dist(p[i], p[j]), i, j});
      }

    sort(v.begin(), v.end());
    double res = 1e20;
    for (int i = 0; i < v.size(); i++) {
      int j = i + 1;
      // 找出能构成矩形的下标范围
      while (j < v.size() && v[i][0] == v[j][0] && v[i][1] == v[j][1] &&
             v[i][2] == v[j][2])
        j++;
      for (int a = i; a < j; a++)
        for (int b = i; b < a; b++) {
          auto &a1 = p[v[a][3]], &a2 = p[v[a][4]], &b1 = p[v[b][3]],
               &b2 = p[v[b][4]];
          double area = sqrt(get_dist(a1, b1)) * sqrt(get_dist(a1, b2));
          if (area > 0) res = min(res, area);
        }
      i = j - 1;
    }

	return res == 1e20 ? 0 : res;
  }
};

时间复杂度 O ( n 2 + ∑ e i 2 ) O(n^2+\sum e_i^2) O(n2+ei2) e i e_i ei表示归为同一类的边的数量,空间 O ( n 2 ) O(n^2) O(n2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值