执行操作标记数组中的元素
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/dd851247a139a959200bd9949f367ce8.png)
代码
class Solution {
// 方法接收一个整数数组nums和一个查询数组queries,返回每次查询后未被标记的元素的总和数组
public long[] unmarkedSumArray(int[] nums, int[][] queries) {
boolean[] visited = new boolean[nums.length]; // 标记数组,用于跟踪哪些元素已被移除
long[] answer = new long[queries.length]; // 存储每次查询后的未被移除元素总和
// 优先队列,根据元素值的大小进行排序,如果元素值相同,则根据索引排序
PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) return o1[1] - o2[1];
return o1[0] - o2[0];
}
});
long sum = 0; // 存储当前所有未被移除元素的总和
for (int i = 0; i < nums.length; i++) {
sum += nums[i]; // 初始化总和
pq.add(new int[]{nums[i], i}); // 将元素及其索引加入优先队列
}
int t = 0; // 用于遍历查询结果数组
for (int[] a : queries) {
int index = a[0]; // 获取要移除的元素索引
int k = a[1]; // 获取要额外移除的元素数量
// 如果该元素尚未被移除,则移除它,并更新总和
if (!visited[index]) {
sum -= nums[index];
visited[index] = true; // 标记为已访问
}
// 移除额外的k个最小元素
for (int i = 1; i <= k; i++) {
// 移除所有已经标记为已访问的元素,直到遇到一个未被移除的元素
while (!pq.isEmpty() && visited[pq.peek()[1]]) {
pq.poll();
}
// 如果优先队列为空,则停止移除
if (pq.isEmpty()) {
break;
}
// 移除队列顶部的元素(即当前最小的未被移除元素),更新总和,并标记为已访问
int[] cur = pq.poll();
sum -= cur[0];
visited[cur[1]] = true;
}
// 存储当前的总和到答案数组中
answer[t++] = sum;
}
return answer; // 返回答案数组
}
}