1. 程式人生 > 實用技巧 >519題-隨機翻轉矩陣

519題-隨機翻轉矩陣

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;
    }
}