题目

用一个下标从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