• LeetCode算法题-Number of Boomerangs(Java实现)


    这是悦乐书的第231次更新,第244篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第98题(顺位题号是447)。给定平面中的n个点都是成对不同的,“回旋镖”是点(i,j,k)的元组,使得i和j之间的距离等于i和k之间的距离(元组的顺序很重要))。找到回旋镖的数量。例如:

    输入:[[0,0],[1,0],[2,0]
    输出:2
    说明:两个回旋镖是[[1,0],[0,0],[2,0]]和[[1,0],[2,0],[0,0]]

    您可以假设n最多为500,点的坐标都在[-10000,10000](含)范围内。

    本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    02 解题

    题目中回旋镖的意思是任意三点,只要满足两两距离相等就是一个回旋镖。比如a点,有两个点b和c到a的距离相等,那么就有两种组合,abc和acb都满足回旋镖。如果是三个点到a的距离都相等,就会有六种组合,就像排列组合一样。

    我们只需要将距离相等的点记录下来,然后带入排列组合的公式n*(n-1)中,累加求和即可,最后的和就是全部可能的回旋镖。使用两层循环,让每一个点都做一次a点,去计算那些到a点距离相等的点。两点之间距离公式(x1-x2)2+(y1-y2)2,正常应该是需要开平方的,但是题目中有说范围,因此直接使用平方和,同时也不必担心溢出的风险。

    public int numberOfBoomerangs(int[][] points) {
        int result = 0;
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i=0; i<points.length; i++) {
            for (int j=0; j<points.length; j++) {
                if (i == j) {
                    continue;
                }
                int a = points[i][0]-points[j][0];
                int b = points[i][1]-points[j][1];
                map.put(a*a+b*b, map.getOrDefault(a*a+b*b, 0)+1);
            }
            for (int val : map.values()) {
                result += val*(val-1);
            }
            map.clear();
        }
        return result;
    }
    

    03 小结

    算法专题目前已日更超过三个月,算法题文章98+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    Kotlin协程第一个示例剖析及Kotlin线程使用技巧
    大数据JavaWeb之java基础巩固----Junit&反射&注解
    Kotlin协程重要概念详解【纯理论】
    Kotlin反射在属性上的应用实战
    Kotlin反射操纵构造方法与伴生对象
    个人任务day4
    典型用户和用户场景
    个人任务Day3
    个人任务2
    个人任务1
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10270015.html
Copyright © 2020-2023  润新知