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

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的遍历,也是一个小注意点

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

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

相关推荐
小蒋学算法19 小时前
贪心算法:IPO
算法
得物技术20 小时前
大模型如何革新搜索相关性?智能升级让搜索更“懂你”|得物技术
算法·搜索引擎·排序算法
mit6.82420 小时前
hash滑窗|dp
算法
Shinom1ya_20 小时前
算法 day 42
数据结构·算法·leetcode
earthzhang202120 小时前
【2051】【例3.1】偶数
开发语言·数据结构·算法·青少年编程·图论
专注VB编程开发20年20 小时前
.net c#音频放大,音量增益算法防止溢出
算法·c#·音频处理·录音·音量增益·增益控制
唯道行20 小时前
计算机图形学·6 OpenGL编程3 谢尔宾斯基垫与三维编程
人工智能·算法·计算机视觉·计算机图形学·三维·谢尔宾斯基垫
高山上有一只小老虎20 小时前
求最大连续bit数
java·算法
Dylan的码园20 小时前
以二叉树问题为基础的递归调试学习(上)
java·学习·算法·leetcode·r-tree
少许极端20 小时前
算法奇妙屋(九)-栈
java·数据结构·算法·