Uno: solución al problema
Dos: ejemplos de código completos (versión C ++ y versión Java)
C ++:
class RandomizedSet { private : map < int , int > m_map; vector < int > m_data; public : / * * Inicialice su estructura de datos aquí. * / RandomizedSet () { } / * * Inserta un valor en el conjunto. Devuelve verdadero si el conjunto no contenía el elemento especificado. * / bool insert ( int val) { if (m_map.count (val)! = 0 ) return false ; m_data.push_back (val); m_map [val] = m_data.size () - 1 ; volver verdadero ; } / * * Elimina un valor del conjunto. Devuelve verdadero si el conjunto contenía el elemento especificado. * / bool remove ( int val) { if (m_map.count (val) == 0 ) return false ; int idx = m_map [val]; int lastVal = m_data [m_data.size () - 1 ]; m_data [idx] = lastVal; m_data.pop_back (); m_map [lastVal] = idx; m_map.erase (val); volver verdadero ; } / * * Obtener un elemento aleatorio del conjunto. * / int getRandom () { int idx = rand ()% (m_data.size ()); devuelve m_data [idx]; } };
Java:
class RandomizedSet { mapa privado <entero, entero> m_map = new HashMap <> (); Lista privada <Integer> m_data = new ArrayList <> (); Random aleatorio privado = nuevo Random (); / * * Inicializa tu estructura de datos aquí. * / public RandomizedSet () { } / * * Inserta un valor en el conjunto. Devuelve verdadero si el conjunto no contenía el elemento especificado. * / public boolean insert ( int val) { if(m_map.containsKey (val)) devuelve falso ; m_data.add (val); m_map.put (val, m_data.size () - 1 ); volver verdadero ; } / * * Elimina un valor del conjunto. Devuelve verdadero si el conjunto contenía el elemento especificado. * / public boolean remove ( int val) { if (! m_map.containsKey (val)) return false ; int idx = m_map. obtener (val); int lastVal = m_data. get (m_data.size () -1 ); m_data. set (idx, lastVal); m_data.remove (m_data.size () - 1 ); m_map.put (lastVal, idx); m_map.remove (val); volver verdadero ; } / * * Obtener un elemento aleatorio del conjunto. * / public int getRandom () { int idx = RANDOM.nextInt (m_data.size ()); devuelve m_data. obtener (idx); } }