Reducir la cantidad de elementos distintos en el arreglo
Tengo una matriz de números y otro número K
.
Mi tarea es reducir la cantidad de elementos distintos en la matriz. Para eso, puedo actualizar la matriz varias veces. Para actualizar la matriz, debo seguir estos pasos:
Seleccionar un elemento en el índice i
y sumarle ese elemento K
, y restar K a todos los demás elementos restantes.
Para actualizar una matriz, puedo seleccionar el mismo índice varias veces.
Ejemplo:
K = 1
Array: [3,1,3]
Respuesta: 3
Estoy eligiendo el índice = 1, como [3-1, 1+1, 3-1] = [2,2,2] por lo que tenemos el número 2 que aparece 3 veces, por lo que este elemento ocurre el número máximo de veces. Por lo tanto, la respuesta es 3.
Otro ejemplo:
K = 1
Array: [1,2,2]
Respuesta: 2
No es posible hacer que todos los elementos sean iguales, por lo que tenemos el número 2 que aparece 2 veces, por lo que la respuesta es 2.
El tamaño de la matriz puede ser [1, 1000], y el valor de K y los elementos en la matriz están en el rango [0, 1000]
Aquí está mi código que intenté, pero mi enfoque no es correcto.
“`java
public static int process(int K, int[] A) {
Map<integer, integer=""> map = new TreeMap<>();
for (int key : A) {
map.put(key, map.getOrDefault(key, 0) + 1);
}
int result = 0;
boolean flag = false;
int last = -1, cur = -1;
for (int key : map.keySet()) {
if (flag == false) {
flag = true;
last = key;
continue;
}
cur = key;
int a = map.get(last), b = map.get(cur);
if (Math.abs(last – cur) > K) {
result += a + b;
} else {
result += Math.max(a, b);
}
}
last = cur;
<pre><code>return result;
</code></pre>
}
“`</integer,>
davy.ai
El problema dado se puede resolver en una complejidad de tiempo O(n log n) utilizando una cola de prioridad. Aquí están los pasos:
a. Obtener el elemento con el valor mínimo (digamos x) de la cola de prioridad y eliminarlo.
b. Incrementar el recuento de x en el mapa.
c. Agregar K a x e insertarlo de nuevo en la cola de prioridad.
d. Decrementar todos los demás elementos en la cola de prioridad en K.
e. Si el nuevo elemento x después de la adición de K sigue siendo menor o igual al elemento mínimo en la cola de prioridad, entonces repetir los pasos a-e hasta que esta condición sea falsa.
f. Actualizar el recuento máximo “count”.
Aquí está el código en Java que implementa el algoritmo anterior:
“`java
import java.util.*;
public class ReduceArrayDistinct { pq = new PriorityQueue<>();
public static int reduceDistinct(int K, int[] A) {
// Inicializar cola de prioridad con todos los elementos del arreglo
PriorityQueue
for (int x : A) {
pq.offer(x);
}
}
“`</integer,>