519. Random Flip Matrix

Difficulty:
Related Topics:
Similar Questions:

    Problem

    There is an m x n binary grid matrix with all the values set 0 initially. Design an algorithm to randomly pick an index (i, j) where matrix[i][j] == 0 and flips it to 1. All the indices (i, j) where matrix[i][j] == 0 should be equally likely to be returned.

    Optimize your algorithm to minimize the number of calls made to the built-in random function of your language and optimize the time and space complexity.

    Implement the Solution class:

      Example 1:

    Input
    ["Solution", "flip", "flip", "flip", "reset", "flip"]
    [[3, 1], [], [], [], [], []]
    Output
    [null, [1, 0], [2, 0], [0, 0], null, [2, 0]]
    
    Explanation
    Solution solution = new Solution(3, 1);
    solution.flip();  // return [1, 0], [0,0], [1,0], and [2,0] should be equally likely to be returned.
    solution.flip();  // return [2, 0], Since [1,0] was returned, [2,0] and [0,0]
    solution.flip();  // return [0, 0], Based on the previously returned indices, only [0,0] can be returned.
    solution.reset(); // All the values are reset to 0 and can be returned.
    solution.flip();  // return [2, 0], [0,0], [1,0], and [2,0] should be equally likely to be returned.
    

      Constraints:

    Solution (Java)

    class Solution {
        private final int cols;
        private final int total;
        private final Random rand;
        private final Set<Integer> available;
    
        public Solution(int nRows, int nCols) {
            this.cols = nCols;
            this.rand = new Random();
            this.available = new HashSet<>();
            this.total = nRows * this.cols;
        }
    
        public int[] flip() {
            int x = rand.nextInt(this.total);
            while (available.contains(x)) {
                x = rand.nextInt(this.total);
            }
    
            this.available.add(x);
            return new int[] {x / this.cols, x % this.cols};
        }
    
        public void reset() {
            this.available.clear();
        }
    }
    
    /**
     * Your Solution object will be instantiated and called as such:
     * Solution obj = new Solution(m, n);
     * int[] param_1 = obj.flip();
     * obj.reset();
     */
    

    Explain:

    nope.

    Complexity: