2001. 可互换矩形的组数Java
文章发布较早,内容可能过时,阅读注意甄别。
# 题目
用一个下标从 0 开始的二维整数数组 rectangles 来表示 n 个矩形,其中 rectangles[i] = [widthi, heighti] 表示第 i 个矩形的宽度和高度。
如果两个矩形 i 和 j(i < j)的宽高比相同,则认为这两个矩形 可互换 。更规范的说法是,两个矩形满足 widthi/heighti == widthj/heightj(使用实数除法而非整数除法),则认为这两个矩形 可互换 。
计算并返回 rectangles 中有多少对 可互换 矩形。
示例 1:
输入:rectangles = [[4,8],[3,6],[10,20],[15,30]]
输出:6
解释:下面按下标(从 0 开始)列出可互换矩形的配对情况:
- 矩形 0 和矩形 1 :4/8 == 3/6
- 矩形 0 和矩形 2 :4/8 == 10/20
- 矩形 0 和矩形 3 :4/8 == 15/30
- 矩形 1 和矩形 2 :3/6 == 10/20
- 矩形 1 和矩形 3 :3/6 == 15/30
- 矩形 2 和矩形 3 :10/20 == 15/30
示例 2:
输入:rectangles = [[4,5],[7,8]]
输出:0
解释:不存在成对的可互换矩形。
提示:
- n == rectangles.length
- 1 <= n <= 105
- rectangles[i].length == 2
- 1 <= widthi, heighti <= 105
# 思路
枚举右维护左
# 解法
class Solution {
//核心思路 枚举右 维护左
public long interchangeableRectangles(int[][] rectangles) {
// 创建一个HashMap来记录每个长宽比出现的次数
Map<Double,Integer> map = new HashMap<>();
long ans = 0; // 用来记录符合条件的矩形对的数量
// 遍历所有矩形
for(int[] arr: rectangles) {
// 计算当前矩形的长宽比 (width/height)
double tmp = 1.0 * arr[0] / arr[1]; // 使用浮动点数来避免整数除法
// 如果该长宽比已经出现过,则将已有的长宽比对应次数加到结果
ans += map.getOrDefault(tmp, 0);
// 更新该长宽比的出现次数
map.put(tmp, map.getOrDefault(tmp, 0) + 1);
}
// 返回最终的结果
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 总结
- 分析出几种情况,然后分别对各个情况实现