1:問題の解決策
2:完全なコード例(C ++バージョンとJavaバージョン)
C ++:
クラスRandomizedSet { private : map < int、int > m_map; vector < int > m_data; public : / * *ここでデータ構造を初期化します。* / RandomizedSet(){ } / * *セットに値を挿入します。セットに指定された要素がまだ含まれていない場合はtrueを返します。* / bool insert(int val) { if(m_map.count(val)!= 0)return false ; m_data.push_back(val); m_map [val] = m_data.size()- 1 ; trueを返し ます。 } / * *セットから値を削除します。セットに指定された要素が含まれている場合はtrueを返します。* / BOOL削除(INT ヴァル) { 場合(m_map.count(ヴァル)== 0)リターン 偽。 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); trueを返し ます。 } / * *セットからランダムな要素を取得します。* / int getRandom() { int idx = rand()%(m_data.size()); m_data [idx]を返します。 } };
Java:
クラスRandomizedSet { private Map <Integer、Integer> m_map = new HashMap <> (); private List <Integer> m_data = new ArrayList <> (); プライベートランダムRANDOM = new Random(); / * *ここでデータ構造を初期化します。* / public RandomizedSet(){ } / * *セットに値を挿入します。セットに指定された要素がまだ含まれていない場合はtrueを返します。* / public boolean insert(int val) { if(m_map.containsKey(val))return false ; m_data.add(val); m_map.put(val、m_data.size() - 1 ); trueを返し ます。 } / * *セットから値を削除します。セットに指定された要素が含まれている場合はtrueを返します。* / public boolean remove(int val) { if(!m_map.containsKey(val))return false ; int idx = m_map。get (val); int lastVal = m_data。get(m_data.size()-1 ); m_data。セット(idx、lastVal); m_data.remove(m_data.size() - 1 ); m_map.put(lastVal、idx); m_map.remove(val); trueを返し ます。 } / * *セットからランダムな要素を取得します。* / public int getRandom() { int idx = RANDOM.nextInt(m_data.size()); m_dataを返します。get (idx); } }