Leetcode刷题100天—5868. 可互换矩形的组数(哈希)—day36(周赛)

Posted 神的孩子都在歌唱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题100天—5868. 可互换矩形的组数(哈希)—day36(周赛)相关的知识,希望对你有一定的参考价值。

前言:

作者:神的孩子在歌唱

大家好,我叫运智

5868. 可互换矩形的组数

难度中等2收藏分享切换为英文接收动态反馈

用一个下标从 0 开始的二维整数数组 rectangles 来表示 n 个矩形,其中 rectangles[i] = [widthi, heighti] 表示第 i 个矩形的宽度和高度。

如果两个矩形 iji < 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

解题思路

  1. 通过哈希统计宽高比后相同的次数
  2. 在通过公式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

Leetcode刷题100天—226. 翻转二叉树(二叉树)—day03

Leetcode刷题100天—206. 反转链表(链表)—day01