519. 随机翻转矩阵(Python)

题目

难度:★★☆☆☆
类型:二维数组
方法:随机数

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

题中给出一个 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]]
输入语法解释:

输入包含两个列表:被调用的子程序和他们的参数。Solution 的构造函数有两个参数,分别为 n_rows 和 n_cols。flip 和 reset 没有参数,参数总会以列表形式给出,哪怕该列表为空

解答

这道题的要求是将初始化为零的二维矩阵通过flip操作实现随机地将一个位置的值翻转为1,其中flip可能会被调用多次,我们可以将二维矩阵看成一维,每一个位置都有一个对应的下标,使用random包中的randint函数,随机生成一个位置,并用一个集合存储当前被翻转的位置有哪些,为了避免重复翻转,我们通过判断刚刚生成的下标是否在集合中实现。

from random import randint


class Solution:
    def __init__(self, n_rows: int, n_cols: int):
        # 编号第i行第j列标记为i * n_cols + j
        self.r = n_rows
        self.c = n_cols
        self.set_ = set()

    def flip(self) -> List[int]:
        randnum = randint(0,self.r * self.c - 1)
        while randnum in self.set_:
            randnum = randint(0,self.r * self.c - 1)
        self.set_.add(randnum)
        return [randnum // self.c,randnum % self.c]
        
    def reset(self) -> None:
        self.set_ = set()

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

你可能感兴趣的:(519. 随机翻转矩阵(Python))