class Solution {
/**
* map中的key和value:
* key:虽然作为索引,并不一定是实际的索引值
* value:value作为返回的值,value记录的索引一定要是对应位置为0的
*/
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
Random ra = new Random(300);
int m, n, cnt;
public Solution(int m, int n) {
this.m = m;
this.n = n;
this.cnt = m * n;
}
public int[] flip() {
//在[0,cnt)取一个随机数,并给右边界-1
int x = ra.nextInt(cnt--);
/**
* 这个x索引对应的可能是1或者0
* (1)未被反转:map中不存在对应的索引,所以idx的值依然为x的值,此时x被反转
* 我们要保证value中对应的应该为未被反转的,因此我们要更新value值,将尾部,即右边界
* 的值赋值给这个value值,我们也要保证。这个位置是未被使用过的,我们同样要
* map.getOrDefault(cnt, cnt),这样就做到了value的未被使用,且可以保证连续性
* 因为random得到的key是连续的
* (2)被反转过:map中存在对应的索引
*/
int idx = map.getOrDefault(x, x);
map.put(x, map.getOrDefault(cnt, cnt));
return new int[] { idx / n, idx % n };
}
public void reset() {
cnt = m * n;
map.clear();
}
}