算法每一题,成长每一天~
C0E42 找数字/找等值元素
真题链接:【持续更新】2024华为 OD 机试E卷 机考真题库清单(全真题库)
思路
1、遍历二维数组,数字相同的放一起
2、再遍历二维数组,从相同的数字集合中取出元素,计算距离,取最小值
Java
package com.ccr.paper_f;
import java.util.*;
public class C0E42 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
int[][] arr = new int[m][n];
Map<Integer, List<Point>> map = new HashMap<>(); // 按值来存点
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = in.nextInt();
map.computeIfAbsent(arr[i][j], k -> new ArrayList<>())
.add(new Point(i, j, arr[i][j]));
}
}
int[][] mins = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
List<Point> points = map.get(arr[i][j]);
int min = Integer.MAX_VALUE;
// 逐个计算距离
for (Point p : points) {
int distance = p.distance(i, j);
if (distance > 0 && distance < min) { // 0表示自己,跳过
min = distance;
}
}
mins[i][j] = min == Integer.MAX_VALUE ? -1 : min;
}
}
// 打印二维数组
String[] result = new String[m];
for (int i = 0; i < m; i++) {
result[i] = Arrays.toString(mins[i]);
}
System.out.println(Arrays.toString(result));
}
public static class Point {
int x;
int y;
int value;
public Point(int x, int y, int value) {
this.x = x;
this.y = y;
this.value = value;
}
public int distance(int x, int y) {
return Math.abs(this.x - x) + Math.abs(this.y - y);
}
}
}
总结
1、有更好的方法吗?
算法要多练多练多练!!