Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/2001.html
2001. Number of Pairs of Interchangeable Rectangles (Medium)
You are given n
rectangles represented by a 0-indexed 2D integer array rectangles
, where rectangles[i] = [widthi, heighti]
denotes the width and height of the ith
rectangle.
Two rectangles i
and j
(i < j
) are considered interchangeable if they have the same width-to-height ratio. More formally, two rectangles are interchangeable if widthi/heighti == widthj/heightj
(using decimal division, not integer division).
Return the number of pairs of interchangeable rectangles in rectangles
.
Example 1:
Input: rectangles = [[4,8],[3,6],[10,20],[15,30]] Output: 6 Explanation: The following are the interchangeable pairs of rectangles by index (0-indexed): - Rectangle 0 with rectangle 1: 4/8 == 3/6. - Rectangle 0 with rectangle 2: 4/8 == 10/20. - Rectangle 0 with rectangle 3: 4/8 == 15/30. - Rectangle 1 with rectangle 2: 3/6 == 10/20. - Rectangle 1 with rectangle 3: 3/6 == 15/30. - Rectangle 2 with rectangle 3: 10/20 == 15/30.
Example 2:
Input: rectangles = [[4,5],[7,8]] Output: 0 Explanation: There are no interchangeable pairs of rectangles.
Constraints:
n == rectangles.length
1 <= n <= 105
rectangles[i].length == 2
1 <= widthi, heighti <= 105
Similar Questions:
Solution 1.
-
class Solution { public long interchangeableRectangles(int[][] rectangles) { long ans = 0; int n = rectangles.length + 1; Map<Long, Integer> cnt = new HashMap<>(); for (var e : rectangles) { int w = e[0], h = e[1]; int g = gcd(w, h); w /= g; h /= g; long x = (long) w * n + h; ans += cnt.getOrDefault(x, 0); cnt.merge(x, 1, Integer::sum); } return ans; } private int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } }
-
class Solution { public: long long interchangeableRectangles(vector<vector<int>>& rectangles) { long long ans = 0; int n = rectangles.size(); unordered_map<long long, int> cnt; for (auto& e : rectangles) { int w = e[0], h = e[1]; int g = gcd(w, h); w /= g; h /= g; long long x = 1ll * w * (n + 1) + h; ans += cnt[x]; cnt[x]++; } return ans; } };
-
class Solution: def interchangeableRectangles(self, rectangles: List[List[int]]) -> int: ans = 0 cnt = Counter() for w, h in rectangles: g = gcd(w, h) w, h = w // g, h // g ans += cnt[(w, h)] cnt[(w, h)] += 1 return ans
-
func interchangeableRectangles(rectangles [][]int) int64 { ans := 0 n := len(rectangles) cnt := map[int]int{} for _, e := range rectangles { w, h := e[0], e[1] g := gcd(w, h) w, h = w/g, h/g x := w*(n+1) + h ans += cnt[x] cnt[x]++ } return int64(ans) } func gcd(a, b int) int { if b == 0 { return a } return gcd(b, a%b) }
-
/** * @param {number[][]} rectangles * @return {number} */ var interchangeableRectangles = function (rectangles) { const cnt = new Map(); let ans = 0; for (let [w, h] of rectangles) { const g = gcd(w, h); w = Math.floor(w / g); h = Math.floor(h / g); const x = w * (rectangles.length + 1) + h; ans += cnt.get(x) | 0; cnt.set(x, (cnt.get(x) | 0) + 1); } return ans; }; function gcd(a, b) { if (b == 0) { return a; } return gcd(b, a % b); }