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

举报
神的孩子在歌唱 发表于 2021/09/30 18:13:04 2021/09/30
【摘要】 前言:作者:神的孩子在歌唱大家好,我叫运智 5868. 可互换矩形的组数难度中等2收藏分享切换为英文接收动态反馈用一个下标从 0 开始的二维整数数组 rectangles 来表示 n 个矩形,其中 rectangles[i] = [widthi, heighti] 表示第 i 个矩形的宽度和高度。如果两个矩形 i 和 j(i < j)的宽高比相同,则认为这两个矩形 可互换 。更规范的说法是,...

前言:

作者:神的孩子在歌唱

大家好,我叫运智

image-20210912122808352

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 和矩形 14/8 == 3/6
- 矩形 0 和矩形 24/8 == 10/20
- 矩形 0 和矩形 34/8 == 15/30
- 矩形 1 和矩形 23/6 == 10/20
- 矩形 1 和矩形 33/6 == 15/30
- 矩形 2 和矩形 310/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

转载说明:跟我说明,务必注明来源,附带本人博客连接。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。