57. Insert Delete GetRandom O(1)
中文
English
设计一个数据结构实现在平均 O(1) 的复杂度下执行以下所有的操作。
insert(val): 如果这个元素不在set中,则插入。
remove(val): 如果这个元素在set中,则从set中移除。
getRandom: 随机从set中返回一个元素。每一个元素返回的可能性必须相同。
样例
// 初始化空集set
RandomizedSet randomSet = new RandomizedSet();
// 1插入set中。返回正确因为1被成功插入
randomSet.insert(1);
// 返回错误因为2不在set中
randomSet.remove(2);
// 2插入set中,返回正确,set现在有[1,2]。
randomSet.insert(2);
// getRandom 应该随机的返回1或2。
randomSet.getRandom();
// 从set中移除1,返回正确。set现在有[2]。
randomSet.remove(1);
// 2已经在set中,返回错误。
randomSet.insert(2);
// 因为2是set中唯一的数字,所以getRandom总是返回2。
randomSet.getRandom();
class RandomizedSet {
public:
unordered_map<int ,int > kv;//用来存的是元素编号和元素值
unordered_map<int, int> vk;//用来存的是元素值和元素编号
int index = 0;//存当前编号
RandomizedSet() {
// do intialization if necessary
}
/*
* @param val: a value to the set
* @return: true if the set did not already contain the specified element or false
*/
bool insert(int val)
{
// write your code here
if (vk.count(val) == 1)
{
return false;
}
else
{
kv.insert(pair<int, int>(index, val));
vk.insert(pair<int, int>(val, index));
index++;
}
return true;
}
/*
* @param val: a value from the set
* @return: true if the set contained the specified element or false
*/
bool remove(int val)
{
// write your code here
//判断当前的元素个数
if(vk.count(val) == 0)
return false;
if (index == 1) {
kv.erase(index-1);
vk.erase(val);
index--;
}
else
{
int tval = kv.find(index-1)->second;
int tindex = vk.find(val)->second;//当前元素位置
kv.erase(index -1);//删除最后一个位置
kv[tindex] = tval;//用最后一个值覆盖当前值
vk.erase(val);
vk[tval] = tindex;//修正当前位置
index--;
}
return true;
}
/*
* @return: Get a random element from the set
*/
int getRandom()
{
// write your code here
// srand(time(NULL));
return kv.find(rand()%(index))->second;
}
};
class Solution {
public:
/*
* @param grid: a boolean 2D matrix
* @return: an integer
*/
vector<vector<bool>> g;
void DFS(const int& i,const int& j)
{
if(g[i][j]==0) return;
g[i][j]=0;
if(i>0) DFS(i-1,j);
if(j>0) DFS(i,j-1);
if(i<g.size()-1) DFS(i+1,j);
if(j<g[0].size()-1) DFS(i,j+1);
}
int numIslands(vector<vector<bool>> &grid) {
// write your code here
int count=0;
g=move(grid);
for(int i=0;i<g.size();i++)
{
for(int j=0;j<g[i].size();j++)
{
if(g[i][j]!=0)
{
DFS(i,j);
count++;
}
}
}
return count;
}
};
//从任意不为0的地方,往四个方向走,如果是0 则停止,如果不是0,则设置为0 这样凡是1相连的地方都会被
设置为0 下次就不会再次经过,这样,下次不会再走,这样就会找到所有的岛。