题目
思路一 哈希表+swap
使用哈希表存储一个映射关系,如果翻转过,就往哈希表里添加这个随机值和它对应的值,使得0-total映射的值都是没有翻转的。
代码一
class Solution {
public:
Solution(int m, int n) {
this->m=m;
this->n=n;
this->total=m*n;
srand(time(nullptr));
}
vector<int> flip() {
int x=rand()%total--;
int idx=mp.count(x)?mp[x]:x;
mp[x]=mp.count(total)?mp[total]:total;
return {idx/n,idx%n};
}
void reset() {
total=m*n;
mp.clear();
}
private:
int m,n,total;
unordered_map<int,int> mp;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(m, n);
* vector<int> param_1 = obj->flip();
* obj->reset();
*/
思路二 双指针
在全范围中随机生成一个数,往两边找未翻转过的数据。
代码二
class Solution {
public:
Solution(int m, int n) {
this->m=m;
this->n=n;
srand(time(nullptr));
}
vector<int> flip() {
int sum=m*n;
int a=rand()%sum,b=a;
while(a>=0&&set.count(a)) a--;
while(b<sum&&set.count(b)) b++;
int c=(a>=0&&!set.count(a))?a:b;
set.insert(c);
return {c/n,c%n};
}
void reset() {
set.clear();
}
private:
int m,n;
unordered_set<int> set;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(m, n);
* vector<int> param_1 = obj->flip();
* obj->reset();
*/