可互换矩形的组数

Leetcode 2001.可交换矩形的组数

题目

用一个下标从0开始的二维整数数组rectangles来表示n个矩形,其中rectangles[i] = [widthi, heighti] 表示第 i 个矩形的宽度和高度。

如果两个矩形 i 和 j(i < j)的宽高比相同,则认为这两个矩形 可互换 。更规范的说法是,两个矩形满足 widthi/heighti == widthj/heightj(使用实数除法而非整数除法),则认为这两个矩形可互换。

计算并返回 rectangles 中有多少对可互换矩形。

提示:

  • n==rectangles.length
  • 1<=n<=10^5
  • rectangles[i].length == 2
  • 1<=width_i,height_i<=10^5

题解

对于讨论比值的题目,优先使用gcd,因为对于不整除的数,精度会影响答案。

int gcd(int a,int b){
      return !b?a:gcd(b,a%b);
}

也可以直接使用模板库里的__gcd();
如果直接暴力统计每组相同比值数,复杂度o(n^2),样例数据1e5,肯定会tle。
由于最近在stl小能手宋某的熏陶下学习了很多实用模板,所以考虑使用map,将比值和该比值下相同数cnt,该类型插入与删除的复杂度为nlogn,大大提高了代码效率。

class Solution {
public:
    long long interchangeableRectangles(vector<vector<int>>& r) {
        int n=r.size();
        long long ans=0;
        map<pair<int,int>,long long> cnt;
        for(int i=0;i<n;i++){
            int c=__gcd(r[i][0],r[i][1]);//最大公因数
            cnt[make_pair(r[i][0]/c,r[i][1]/c)]++;
        }
        for(auto i:cnt){
            if(i.second>1){//排列组合数
                ans+=(i.second-1)*i.second/2;
            }
        } 
        return ans;
    }
};

因为原题标签里有霖某不熟悉的hash表,所以空闲时就顺便查了一下……啊这,不就是unorder_map吗,顾名思义,是不会自动排序的map,不过映射查询时间会更低。
这道题因为我最开始想的就是sort再统计相同数,所以就直接用map了没有考虑那么多orz

posted @ 2021-10-28 13:16  Chilyyy  阅读(57)  评论(0)    收藏  举报