Leetcode刷题100天—5868. 可互换矩形的组数(哈希)—day36(周赛)
Posted 神的孩子都在歌唱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题100天—5868. 可互换矩形的组数(哈希)—day36(周赛)相关的知识,希望对你有一定的参考价值。
前言:
作者:神的孩子在歌唱
大家好,我叫运智
5868. 可互换矩形的组数
难度中等2收藏分享切换为英文接收动态反馈
用一个下标从 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
解题思路
- 通过哈希统计宽高比后相同的次数
- 在通过公式
n(n+1)/2
对次数进行运算(比如宽高比相同的次数有4个,那么3*(3+1)/2)=6,说明这个键可互换矩形有6个。
package 双指针;
import java.util.Collection;
import java.util.HashMap;
public class _5868_可互换矩形的组数 {
public long interchangeableRectangles(int[][] rectangles) {
long sum=0;
double[] res=new double[rectangles.length];
// 通过哈希统计相同字符的次数,再通过公式n(n+1)/2进行统计
HashMap<Double,Long> map=new HashMap<>();
int j=0;
// for循环统计,然后将的宽高比存入数组中,为接下来取出哈希中的值
for(int i=0;i<rectangles.length;i++) {
double s=(double)rectangles[i][0]/rectangles[i][1];
// 去重,免得多余的数存入数组
if (!map.containsKey(s)) {
res[j]=s;
j++;
}
// 每存入一个相同数就加一
map.put(s, map.getOrDefault(s, (long)0)+1);
}
int i=0;
while(!map.isEmpty()) {
// System.out.println(res[i]);
// 如果指定的数组存在与哈希中
if (map.containsKey(res[i]) ){
// 获取值
long s=map.get(res[i])-1;
// 如果相同的宽高比大于0就说明至少有1次可互换矩形
if (s>0) {
// 在通过公式获取可互换矩形数
sum+=s*(s+1)/2;
}
// 将对应的值去除
map.remove(res[i]);
}
i++;
}
return sum;
}
}
本人csdn博客:https://blog.csdn.net/weixin_46654114
转载说明:跟我说明,务必注明来源,附带本人博客连接。
以上是关于Leetcode刷题100天—5868. 可互换矩形的组数(哈希)—day36(周赛)的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—441. 排列硬币(数学)—day62
Leetcode刷题100天—705. 设计哈希集合(集合)—day74
Leetcode刷题100天—70. 爬楼梯(动态规划)—day76
Leetcode刷题100天—226. 翻转二叉树(二叉树)—day03