回旋镖的数量

  • 有关题目
    • 题解

题目链接: 回旋镖的数量

有关题目

给定平面上 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
-10^4 <= xi, yi <= 10^4
所有点都 互不相同

题解

Tips

①C++ 11原本的auto 写法 for(auto & j : cnt),然后下方使用 j.first,j.second。C++17的写法改成,可以直接取 map 里面 [v1, v2] 充当 j.first 及 j.second,如果下方不需要读值则可以用_代替
②auto& 与 auto &&的区别 &为引用,相当于C中的指针,拿到所引用数据的地址,&&为右值引用,右值可以看作程序运行中的临时结果,直接引用返回的对象,避免了对象复制,从而提高效率。

法一:枚举 + 哈希表
参考官方题解

思路:
对于点points[i],有 m 个点到其距离相等,结合排列数的知识
我们需要从中选取两个,故有 A(2,m) = m * (m - 1)中组合我们使用哈希表键存储距离的平方,值存储 m 个点,
对于每一个点points[i],我们更新一次答案,直至枚举一遍数组
class Solution {public:int numberOfBoomerangs(vector<vector<int>>& points) {int ans = 0;for (auto& p : points){unordered_map<int, int> mp;for (auto& p1 : points){int squareOfDistance = (p[0] - p1[0]) * (p[0] - p1[0]) +(p[1] - p1[1]) * (p[1] - p1[1]);++mp[squareOfDistance];}for (auto& [_, m] : mp){ans += m * (m - 1);//排列数A(2,m) = m * (m - 1);}}return ans;}
};

时间复杂度:O(n^2),n 为points数组的长度
空间复杂度:O(n),哈希表存储所需O(n)复杂度

法二:优化法一
参考官方题解评论区下梦璃夜·天星

空间优化,少一次遍历。利用排列组合中,每次多一个点,该点和前面每个点各有两个新的组合。
class Solution {public:int numberOfBoomerangs(vector<vector<int>>& points) {int ans = 0;unordered_map<int, int> mp;for (auto&& p1 : points){mp.clear();for (auto&& p2 : points){int dis = (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);ans += 2 * mp[dis]++;}}return ans;}
};

时间复杂度:O(n^2),n 为points数组的长度
空间复杂度:O(n)

《LeetCode之每日一题》:148.回旋镖的数量相关推荐

  1. 每日一题_447.回旋镖的数量

    每日一题_447.回旋镖的数量 leetcode 447 题目: 题意分析: 今天的题目比较简单,没有复杂的算法,主要是用空间换时间.该题是给我们平面上一系列的点,这些点都在整数格点上,然后当其中一个 ...

  2. 「每日一题」回旋镖的数量

    这是 LeetCode 上 2021-9-13 的每日一题:「447. 回旋镖的数量」 1. 题目描述 给定平面上n对互不相同的点points,其中points[i] = [xi, yi].回旋镖是由 ...

  3. 【LeetCode笔记 - 每日一题】375. 猜数字游戏 II (Java、DFS、动态规划)

    文章目录 题目描述 思路 && 代码 DFS 动态规划 新系列-用于区分开高频题和每日一题- 题目描述 一眼二分,但是实际上并不是 这题让我想到社团的猜数字游戏-但是给钱是真过分了= ...

  4. Leetcode题库-回旋镖的数量(java语言版)

    题目描述: 给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序). 找到 ...

  5. LeetCode【每日一题】 1095. 山脉数组中查找目标值

    题目 1095. 山脉数组中查找目标值 (这是一个 交互式问题 ) 给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 ...

  6. 【LeetCode笔记 - 每日一题】373. 查找和最小的 K 对数字(Java、堆、优先队列)

    文章目录 题目描述 思路 && 代码 题目描述 几天没打题,感觉脑子都是一团浆糊.... 升序:肯定得用这条件来优化复杂度 数对:用 int[2] 来表示 思路 && ...

  7. 【LeetCode笔记 - 每日一题】384. 打乱数组(Java、洗牌算法)

    文章目录 题目描述 思路 && 代码 题目描述 中等题,很赞!第一次碰到涉及洗牌算法的题 有点涉及概率,主要是要实现公平的随机 思路 && 代码 采用了 Knuth 洗 ...

  8. leetcode五月每日一题 leetcode974

    一般涉及连续子数组的问题都用前缀和来表示 前缀和及为:(图来自leetcode官方题解) 所以我们扫描这个整数数组A, 维护一个哈希表:键:前缀和模 K 的值,值:出现次数 则每一个前缀和的符合要求的 ...

  9. 【Leetcode】每日一题:唯一摩尔斯密码词

    唯一摩尔斯密码词 国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: 'a' 对应 ".-" , 'b' 对应 "--&quo ...

最新文章

  1. 使用css3的动画模拟太阳系行星公转
  2. 如何在python中显示电脑中的图片-python在终端里面显示一张图片
  3. Java对象之间相同属性的赋值
  4. 【Matlab】一种超简单的二维矩阵降维方法
  5. ASP.NET MVC 中删除无用视图引擎
  6. 如何通过cmd网站服务器地址,如何用cmd进入服务器地址
  7. 梯度为什么是函数增加最快的方向
  8. enumerable java_ruby中的Enumerable的使用
  9. 计算生物学_01机器学习理论部分
  10. 中国电信物联网平台入门学习笔记3: 电信开发者平台使用
  11. sql语句:CASE WHEN END 的用法
  12. Java集合、泛型和枚举
  13. 以太网交换机和普通交换机主要的8大区别介绍
  14. IOS对自动播放语音视频做了限制,h5如何实现间隔一段时间自动播放语音
  15. 红帽杯find_it
  16. js两只手指控制div图片放大缩小功能(2)
  17. python中脚本是指什么_你用Python写过最牛逼的程序/脚本是什么?
  18. 高版本Chrome网页直接播放海康威视大华RTSP流方案,不需服务器转码转流,支持H.265、H.264及2K/4K高清视频
  19. 基于MFC的桌面时钟应用程序
  20. Ubu开启ftp服务 启用root用户登录

热门文章

  1. Linux下软件安装:Circos
  2. C++之auto关键字
  3. error C2440 无法转换到 AFX_PMSG mfc自定义信号及实现 PostMessage FindWindow
  4. SpringClude核心组件之Eureka
  5. 解决:torch, torch-scatter, torch-sparse, torch-cluster, torch-spline-conv 版本不匹配而导致的问题
  6. 日期(datetime)的模糊查询
  7. win10设置pg/pc接口_win10安装postgresql
  8. 读《Jonathan von Neumann and EDVAC》
  9. 微信公共平台OAuth接口消息接口服务中间件-wechat-oauth
  10. linux下TSL如何升级,Ubuntu18.04 TSL来了,你升级了吗?