哈希+组合计数,刷题记录
无序(当前 【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;
}
}