可互換矩形的組數
阿新 • • 發佈:2021-10-28
題目
用一個下標從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