最近在网上一后端开发工程师发出一奇葩言论:程序员工资太高了,建议降薪。这脑袋究竟长几个包,竟然发出这样的言论,工资的高低是有市场决定的,程序员这工资相比较明星,网红来说,简直不值一提。
实际上程序员的学历并不低,大部分都是本科以上学历,尤其是一线城市的大厂,211,985以上的随处可见,有些岗位比如大数据,人工智能,基本上都是硕士起步,搞不明白这点工资怎么就高了。就像评论区的一位网友说的:一个乞丐只会嫉妒另外一个乞丐饭碗里多了一根鸡腿。
来看下今天的算法题,这题是LeetCode的第447题:回旋镖的数量。
问题描述
给定平面上 n 对互不相同的点 points ,其中 points[i] = [xi, yi] 。回旋镖是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。
返回平面上所有回旋镖的数量。
输入:points = [[0,0],[1,0],[2,0]]
输出:2
解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
输入:points = [[1,1],[2,2],[3,3]]
输出:2
n == points.length
1 <= n <= 500
points[i].length == 2
-10^4 <= xi, yi <= 10^4
所有点都 互不相同
问题分析
public int numberOfBoomerangs(int[][] points) {
int res = 0;
Map<Integer, Integer> 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;
}
public:
int numberOfBoomerangs(vector<vector<int>>& points) {
int res = 0;
unordered_map<int, int> 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;
}
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