专栏:50多种数据结构彻底征服

专栏:50多种经典图论算法全部掌握

最近在网上一后端开发工程师发出一奇葩言论:程序员工资太高了,建议降薪。这脑袋究竟长几个包,竟然发出这样的言论,工资的高低是有市场决定的,程序员这工资相比较明星,网红来说,简直不值一提。

实际上程序员的学历并不低,大部分都是本科以上学历,尤其是一线城市的大厂,211,985以上的随处可见,有些岗位比如大数据,人工智能,基本上都是硕士起步,搞不明白这点工资怎么就高了。就像评论区的一位网友说的:一个乞丐只会嫉妒另外一个乞丐饭碗里多了一根鸡腿。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第447题:回旋镖的数量。

问题描述

来源: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

  • n == points.length

  • 1 <= n <= 500

  • points[i].length == 2

  • -10^4 <= xi, yi <= 10^4

  • 所有点都 互不相同

问题分析

这题是让计算回旋镖的数量,回旋镖的形状如下,它有一个顶点,我们以当前顶点为起始点,计算当前顶点到其他所有点的距离。

打开网易新闻 查看精彩图片

假如到当前顶点距离为 m 的有 n 条边,这 n 条边随便选择两条即可构成回旋镖,那么这 n 条边构成总的回旋镖(必须以当前点为顶点)数量为n*(n-1),如果还有其他距离相同的边也可以构成回旋镖,只需要累加即可计算以当前点为顶点所构成的回旋镖的数量。

如果要计算所有回旋镖的数量,我们需要以每一个点为顶点都计算一遍即可,代码如下。

JAVA:

public int numberOfBoomerangs(int[][] points) {     int res = 0;     Map
         
  map =  new HashMap<>();      for ( int[] point1 : points) { // 以其中一个点为起始点,计算到其他所有点的距离。          for ( int[] point2 : points) {              int dis = (point1[ 0] - point2[ 0]) * (point1[ 0] - point2[ 0])                     + (point1[ 1] - point2[ 1]) * (point1[ 1] - point2[ 1]);             map.put(dis, map.getOrDefault(dis,  0) +  1);         }          // 假如到当前点距离为m的有n条边,那么这n条边随便选择两条都可以构成回旋镖,          // 所以组合的数量是n*(n-1),这里只需要累加即可。          for ( int val : map.values())             res += val * (val -  1);         map.clear(); // 这里要清空,下一步以下一个点为起始点计算。     }      return res; }

C++:

public:     int numberOfBoomerangs(vector

 >& points) {         int res = 0;         unordered_map

  map;         for (auto &point1 : points) {// 以其中一个点为起始点,计算到其他所有点的距离。             for (auto &point2 : points) {                 int dis = (point1[0] - point2[0]) * (point1[0] - point2[0])                         + (point1[1] - point2[1]) * (point1[1] - point2[1]);                 map[dis]++;             }             // 假如到当前点距离为m的有n条边,那么这n条边随便选择两条都可以构成回旋镖,             // 所以组合的数量是n*(n-1),这里只需要累加即可。             for (const auto& kv : map)             res += kv.second * (kv.second - 1);             map.clear();// 这里要清空,下一步以下一个点为起始点计算。         }         return res;     }

Python:

def numberOfBoomerangs(self, points: List[List[int]]) -> int:     res = 0     for point1 in points:# 以其中一个点为起始点,计算到其他所有点的距离。         cnt = Counter()         for point2 in points:             dis = dist(point1, point2)             cnt[dis] += 1         for val in cnt.values():             res += val * (val - 1)     return res

笔者简介

博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以 下载我整理的1000多页的PDF算法文档 。