447. 回旋镖的数量(2021.9.13)力扣签到题 & 5868. 可互换矩形的组数

这篇博客探讨了如何利用哈希映射解决两个不同的编程问题。第一个问题是计算一组矩形中可互换矩形的对数,通过将宽高比转换为唯一的哈希键进行统计。第二个问题涉及找出平面上回旋镖的数量,通过计算两点距离并存储频次来实现。两种方法都展示了哈希在优化算法和减少计算复杂性方面的有效性。
摘要由CSDN通过智能技术生成

哈希+组合计数,刷题记录

无序(当前 【1,2】和【2,1】是同一条记录):
题目:
5868. 可互换矩形的组数

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

如果两个矩形 i 和 j(i < j)的宽高比相同,则认为这两个矩形 可互换 。更规范的说法是,两个矩形满足 widthi/heighti == widthj/heightj(使用实数除法而非整数除法),则认为这两个矩形 可互换 。

计算并返回 rectangles 中有多少对 可互换 矩形。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-pairs-of-interchangeable-rectangles
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

//两个矩形满足 widthi/heighti == widthj/heightj,那么左右两式约分后的分式肯定有分子i=分子j,分母i=分母j。
//思路:
//使用HashMap记录每一种矩形出现次数并统计
//key:分子/分母
//value:出现次数
//这个key涉及两个数据,所以widthi*10^5+heighti能保证这种类型的矩形唯一
class Solution {
    public long interchangeableRectangles(int[][] rectangles) {
        Map<Long , Long> map = new HashMap<>();
        long cnt = 0L;
        for(int[] arr: rectangles){
            int gcd = gcd(arr[0],arr[1]);
            long temp = arr[0]/gcd*100000L + arr[1]/gcd;
            map.put(temp , map.getOrDefault(temp,0L) + 1);
        }

        for(Long x : map.values()){
            cnt += x*(x-1) / 2;
        }
        return cnt;
    }

    //求两数的最大公约数
    int gcd(int a ,int b ){
        return b==0?a:gcd(b,a%b);
    }
}

有序(当前 【1,2】和【2,1】不是同一条记录):
题目:
给定平面上 n 对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。

返回平面上所有回旋镖的数量。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-boomerangs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public int numberOfBoomerangs(int[][] points) {
        int cnt = 0;
        for(int[] arr : points){
            Map<Integer,Integer> map = new HashMap<>();
            for(int[] p : points){
                int temp = (arr[0]-p[0])*(arr[0]-p[0]) + (arr[1]-p[1])*(arr[1]-p[1]);
                map.put(temp , map.getOrDefault(temp , 0) + 1);
            }
            for(Integer x : map.values()){
                cnt += x*(x-1);
            }
        }
        return cnt;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值