邻值查找
思路分析
- 读取输入:使用
BufferedReader 高效地读取输入数据,分别读取数组的长度 n 和数组 w 的元素。
- 使用
TreeMap:利用 TreeMap 的有序特性,快速找到与当前元素最接近的元素。TreeMap 的键表示数组元素的值,值表示该元素的索引。
- 寻找最近元素:对于每个元素
w[i],查找 TreeMap 中大于或等于 w[i] 的最小键 up 和小于或等于 w[i] 的最大键 down。
- 比较
w[i] 与 up 和 down 的差值,找到差值最小的元素。
- 如果差值相同,返回位置较小的那个元素。
- 更新
TreeMap:将每个处理过的元素存储到 TreeMap 中,以便在后续步骤中使用。
- 输出结果:使用
BufferedWriter 高效输出结果。
- 时间复杂度:每次查找和插入操作的时间复杂度为 O(log N),总的时间复杂度为 O(N log N),其中
N 是数组的长度。
- 空间复杂度:使用了一个
TreeMap 来存储处理过的元素,因此空间复杂度为 O(N)。
代码实现
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
String[] strs = br.readLine().split(" ");
int[] w = new int[n];
for (int i = 0; i < n; i++)
w[i] = Integer.parseInt(strs[i]);
TreeMap<Integer, Integer> map = new TreeMap<>();
map.put(w[0], 0);
for (int i = 1; i < n; i++) {
Map.Entry<Integer, Integer> up = map.ceilingEntry(w[i]);
Map.Entry<Integer, Integer> down = map.floorEntry(w[i]);
int res = Integer.MAX_VALUE, pos = -1;
if (down != null) {
res = w[i] - down.getKey();
pos = down.getValue();
}
if (up != null && up.getKey() - w[i] < res) {
res = up.getKey() - w[i];
pos = up.getValue();
}
bw.write(res + " " + (pos + 1) + "\n");
map.put(w[i], i);
}
bw.flush();
}
}
同类题型
视频讲解
项目分区导航: 模拟队列 ⬅️ | 05-邻值查找 | ➡️ 类与接口
💬 评论