我有一个数组A,并且必须在每个m步之后找到该数组的模式。在每个步骤中,阵列的一个元素被改变。如何在每次更改后有效地找到模式。我使用以下代码计算初始模式:
import java.io.*;
import java.util.*;
import java.math.*;
class mode {
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
long[] A = new long[N + 1];
HashMap<Long, Integer> hm = new HashMap<Long, Integer>();
for (long i = 0; i <= (long)N; i++) {
hm.put(i, 0);
}
hm.put((long)0, 0);
String[] s = br.readLine().split(" ");
for (int i = 1; i <= N; i++) {
A[i] = Long.parseLong(s[i - 1]);
int res = hm.get(A[i]) + 1;
hm.put(A[i], res);
}
int countM = 0;
long M = hm.get(A[0]);
for (int i = 1; i <= N; i++) {
if (hm.get(A[i]) >= countM) {
if (A[i] > M) {
M = A[i];
}
countM = hm.get(A[i]);
}
}
System.out.println(M);
}
}
例如,让初始数组为{1,2,1,3,3,4,5,1,3,2}。然后初始模式为3.现在我将第五个元素更改为2.现在模式变为2.我再次将已更改数组的第四个元素更改为1.模式变为1.我想在每次更改后找到模式。
答案 0 :(得分:0)
您可以将(number_of_occurrences, value)
对存储在TreeSet
中,并在每次更改初始数组时更新它(最多更改2对,因此需要O(log N)
次)。答案始终是TreeSet
中最大的元素(您可以使用last
方法获取它。)