1. 程式人生 > 其它 >可互換矩形的組數

可互換矩形的組數

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