标签:com swa 运行时 dom map 空白 [] 扫雷 for
题目很简单,可惜不是面经。reservior sampling的题目. 1point3acres.com/bbs windows里面的扫雷,给一个h,w和m. 生成一个高度h,宽度w,总共m颗雷的矩阵。要求m颗雷随机分布。 . visit 1point3acres.com for more. 第一个想法是把雷都放在前m个位置,从m+1的位置开始产生一个index小于m+1的位置,然后交换雷的位置。
这一问写的磕磕绊绊,然后结果居然swap function 写错了,有个地方写太快把i写成了j。被指出来了之后很尴尬。 然后小哥又问了运行时间。说了是O(hw)。然后问能不能在O(m)时间内搞定。才想起来正确的reservior sampling的写法
肯定可以做到O(m),方法就是每确定一个雷的位置,就把这个位置置换到队尾,用一个map记录这个置换。目的就是永远保持空白的位置永远连在一起
public static void genMine(int[][] grid, int m){ int limit = grid.length*grid[0].length; Random rd= new Random(); Map<Integer, Integer> swap = new HashMap<>(); while(m-->0){ int origP = rd.nextInt(limit);. From 1point 3acres bbs int swapP = swap.getOrDefault(origP, origP); swap.put(origP, swap.getOrDefault(--limit, limit)); grid[swapP/grid[0].length][ swapP%grid[0].length] = 1; } }
标签:com swa 运行时 dom map 空白 [] 扫雷 for
原文地址:http://www.cnblogs.com/apanda009/p/7580082.html