La matriz de longitud variable + la tabla hash resuelve el problema de "inserción, eliminación y adquisición de elementos aleatorios en el tiempo O (1)"

Once, O (1) tiempo para insertar, eliminar y obtener elementos aleatorios

11.1 Requisitos para el título

Implemente la clase RandomizedSet:
​ RandomizedSet() Inicializa un objeto RandomizedSet.
​ bool insert(int val) Cuando el elemento val no existe, inserta el elemento en la colección y devuelve verdadero; de lo contrario, devuelve falso.
​ bool remove(int val) Cuando el elemento val existe, elimina el elemento de la colección y devuelve verdadero; de lo contrario, devuelve falso.
​ int getRandom() Devuelve aleatoriamente un elemento de la colección existente (el caso de prueba garantiza que hay al menos un elemento en la colección cuando se llama a este método). Cada elemento debe tener la misma probabilidad de ser devuelto.
Debe implementar todas las funciones de la clase y satisfacer que la complejidad de tiempo promedio de cada función es O(1).

示例:
输入
["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
[[], [1], [2], [2], [], [1], [2], []]
输出
[null, true, false, true, 2, true, false, 2]
解释
RandomizedSet randomizedSet = new RandomizedSet();
randomizedSet.insert(1); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。
randomizedSet.remove(2); // 返回 false ,表示集合中不存在 2 。
randomizedSet.insert(2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。
randomizedSet.getRandom(); // getRandom 应随机返回 1 或 2 。
randomizedSet.remove(1); // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。
randomizedSet.insert(2); // 2 已在集合中,所以返回 false 。
randomizedSet.getRandom(); // 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。

提示:
-231 <= val <= 231 - 1
最多调用 insert、remove 和 getRandom 函数 2 * 105 次
在调用 getRandom 方法时,数据结构中 至少存在一个 元素。

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/insert-delete-getrandom-o1

11.2 Ideas para resolver problemas

  1. Primero defina una Lista para almacenar valores y mapa para almacenar (val, índice);

  2. Inicialice la lista y el mapa definidos en RandomizedSet;

  3. En insert, primero determine si hay un val en el mapa, si existe, es falso, si no existe, agregue el val a los valores y actualice el mapa;

  4. En remove, primero determine si hay un val en el mapa, si no existe es falso, si existe busque el índice del val en el mapa, luego mueva el elemento a eliminar hasta el final, luego elimine el último elemento de valores y finalmente coloque El mapa se puede actualizar y eliminar;

  5. En getRandom, la función de biblioteca aleatoria se introduce primero y, finalmente, el índice de un número se extrae y se devuelve al azar.

Use el método containsKey() de Map para detectar si los datos (valor) existen. Si existe la clave, indica que los datos se han obtenido una vez, luego devuelve directamente el valor de la clave en el Mapa, si es nulo o no; si la clave no existe, generar u obtener datos, ponerlos en el Mapa y devolver los datos.

11.3 Algoritmos

class RandomizedSet {
    
    
    //array存放的是所有的values
    List<Integer> values;
    //map里面存放的是val和values存放的下标index之间的关系(val,index)
    Map<Integer,Integer> map; 

    //初始化
    public RandomizedSet() {
    
    
        values = new ArrayList();
        map = new HashMap();
    }
    
    //插入操作
    public boolean insert(int val) {
    
    
        //如果map中已经存在val,返回false
        if(map.containsKey(val)){
    
    
            return false;
        }
        //先将val添加到values
        values.add(val);
        //再更新map
        map.put(val,values.size()-1);
        return true;
    }
    
    //删除操作
    public boolean remove(int val) {
    
    
        //如果map中不包含val,返回false
        if(!map.containsKey(val)){
    
    
            return false;
        }
        //搜索val在map中的index
        int index = map.get(val);
        //将需要删除的元素移到末尾再删除,否则就会出现数据搬移
        int last = values.get(values.size()-1);
        values.set(index,last);
        //移除values最后一位元素
        values.remove(values.size()-1);
        //在map中更新
        map.put(last,index);
        //在map中删除
        map.remove(val);
        return true;
    }
    
    public int getRandom() {
    
    
        //先引入random的库函数
        Random random = new Random();
        //最后随机取出一个数的index并返回即可
        return values.get(random.nextInt(values.size()));
    }
}

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet obj = new RandomizedSet();
 * boolean param_1 = obj.insert(val);
 * boolean param_2 = obj.remove(val);
 * int param_3 = obj.getRandom();
 */

Video de referencia: estación B arriba maestro Ronan0

Supongo que te gusta

Origin blog.csdn.net/qq_52916408/article/details/124144218
Recomendado
Clasificación