题目描述#

给定一个 n 行的二维数组 rectangles,其中每一行表示一个矩形: rectangles[i] = [width_i, height_i]

如果存在一对矩形 iji < j)满足: width_i / height_i == width_j / height_j(实数除法), 则称这两个矩形是 可互换的

请计算数组中共有多少对可互换的矩形。

思路#

本题目是枚举右,维护左

对于 双变量问题,例如两数之和 a_i + a_j = t, 可以枚举右侧的 a_j,把它转成 单变量问题: 在 a_j 左侧查找是否存在 a_i = t - a_j。 这可以用哈希表维护(遍历时用 map/set 记录已出现的数)。

代码#

class Solution {
    public long interchangeableRectangles(int[][] rectangles) {
        Map<Double, Integer> cnt = new HashMap<>();
        long ans = 0L;
        for (int[] rectangle : rectangles) {
            int width = rectangle[0];
            int height = rectangle[1];
            double k = width * 1.0 / height;
            if (cnt.containsKey(k)) {
                ans += cnt.get(k);
            }
            cnt.merge(k, 1, Integer::sum);
        }
        return ans;
    }
}
本站总访问量  ·  访客数
你的IP 获取中…