算法每日一题:回旋镖的数量 | 坐标距离 | 哈希

hello,大家好,我是星恒

今天给大家带来的每日一题是有关路径距离的题目,其中还涉及到了hash的使用,我们话不多说,直接来看题目:

题目:leetcode 447

给定平面上_ n _对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序 )。

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

示例:
示例 1:

输入:points = [[0,0],[1,0],[2,0]]
输出:2
解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]

示例 2:

输入:points = [[1,1],[2,2],[3,3]]
输出:2

示例 3:

输入:points = [[1,1]]
输出:0

提示:

  • n == points.length
  • 1 <= n <= 500
  • points[i].length == 2
  • -104 <= xi, yi <= 104
  • 所有点都 互不相同

分析:

我们先来说这道题目的思路:

这道题目的意思是,让我们在给的points点中寻找3个点,这三个点可以构成回旋镖型,也就是v字型,某一点距离其他两个点的距离相等

我们可以枚举中间点,然后找到与这个点相等距离的点,最后我们可以找到一些和这个点距离相同的点,然后由于考虑元组顺序(就是i,j,k和k,j,i不同),我们将这些距离相等的点排列组合,假设有m个点和这个点距离相等,他的排列组合种类有:

Am2 = m(m - 1)

所以我们只要得到有多少个点和这个点距离相等,当然,由于相等距离也有好几种情况,所以我们使用hash将距离的情况存储起来,只要遇到和这种情况相同的,就将他的相等点 + 1

我们来看代码

题解:

java 复制代码
class Solution {
    public int numberOfBoomerangs(int[][] points) {
        int ans = 0;
        for (int[] p : points) {
            Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();
            for (int[] q : points) {
                int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);
                cnt.put(dis, cnt.getOrDefault(dis, 0) + 1);
            }
            for (Map.Entry<Integer, Integer> entry : cnt.entrySet()) {
                int m = entry.getValue();
                ans += m * (m - 1);
            }
        }
        return ans;
    }
}

注意:

  • 距离的计算直接使用平方即可,不用开方,这是求距离的常用技巧
  • cnt.getOrDefault(dis, 0),map中的getOrDefault()方法很常用,这里意思是获取键为dis的值,如果没有,就默认他为0
  • 这里涉及到的hash的遍历,也是一个小注意点

如果大家有什么思考和问题,可以在评论区讨论,也可以私信我,很乐意为大家效劳。

好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!

相关推荐
繁依Fanyi12 分钟前
使用 Spring Boot + Redis + Vue 实现动态路由加载页面
开发语言·vue.js·pytorch·spring boot·redis·python·算法
aloha_78917 分钟前
B站宋红康JAVA基础视频教程(chapter14数据结构与集合源码)
java·数据结构·spring boot·算法·spring cloud·mybatis
临沂堇1 小时前
CCF刷题计划——训练计划(反向拓扑排序)
数据结构·c++·算法·拓扑·ccf
铁匠匠匠1 小时前
【C总集篇】第八章 数组和指针
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
Unicorn建模1 小时前
2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析|数学建模完整过程+详细思路+代码全解析
python·算法·数学建模
咕咕吖1 小时前
二叉树的层序遍历(c)
数据结构·算法
“JB...One”2 小时前
openssl-AES-128-CTR加解密结构体
linux·数据结构·算法·ssl
爱数模的小云2 小时前
【华为杯】2024华为杯数模研赛D题 解题思路
算法·华为
好记性+烂笔头2 小时前
hot100-438. 找到字符串中所有字母异位词
算法
六点半8882 小时前
【C/C++】速通涉及string类的经典编程题
c语言·开发语言·c++·算法