519題-隨機翻轉矩陣
阿新 • • 發佈:2020-07-28
1.1題目
題中給出一個 n_rows 行 n_cols 列的二維矩陣,且所有值被初始化為 0。要求編寫一個 flip 函式,均勻隨機的將矩陣中的 0 變為 1,並返回該值的位置下標 [row_id,col_id];同樣編寫一個 reset 函式,將所有的值都重新置為 0。儘量最少呼叫隨機函式 Math.random(),並且優化時間和空間複雜度。
注意:
1 <= n_rows, n_cols <= 10000
0 <= row.id < n_rows 並且 0 <= col.id < n_cols
當矩陣中沒有值為 0 時,不可以呼叫 flip 函式
呼叫 flip 和 reset 函式的次數加起來不會超過 1000 次
示例 1:
輸入:
["Solution","flip","flip","flip","flip"]
[[2,3],[],[],[],[]]
輸出: [null,[0,1],[1,2],[1,0],[1,1]]
示例 2:
輸入:
["Solution","flip","flip","reset","flip"]
[[1,2],[],[],[],[]]
輸出: [null,[0,0],[0,1],null,[0,0]]
1.2解答
首先肯定不能直接用二維陣列來進行隨機座標生成,第一時間複雜度高,需要同時滿足橫縱座標符合條件才能翻轉,所以我們採取將二維陣列壓縮成一維的陣列來進行隨機座標的生成。還有一個問題,就是如何避免隨機到已經為1的座標。這裡我們可以採用將還未翻轉的座標移動到陣列的前面部分。然後通過map集合進行座標對映。
1.3程式碼
package solution; import myclass.TreeNode; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * @author xgj */ public class Solution { Map<Integer,Integer> map = new HashMap<>(); int rows,cols,rem; Random random = new Random(); public Solution(int n_rows, int n_cols) { cols = n_cols; rows = n_rows; rem = n_cols*n_rows; } public int[] flip() { int r = random.nextInt(rem--); Integer orDefault = map.getOrDefault(r, r); Integer put = map.put(r, map.getOrDefault(rem, rem)); return new int[]{orDefault / cols, orDefault % cols}; } public void reset() { map.clear(); rem = rows * cols; } }