LeetCode 519. 随机翻转矩阵

这篇博客讨论了LeetCode上的一道题目,涉及如何优化随机矩阵翻转的算法。作者首先分享了一个导致超时的解决方案,即使用一维数组存储矩阵坐标,然后随机选取并交换。接着,为了提高效率,作者提出了使用字典存储的优化方案,延迟初始化坐标值,避免了数组初始化时的性能开销。在字典中,通过键值对记录矩阵元素及其位置,确保每次随机选取和交换的正确性。
摘要由CSDN通过智能技术生成

题目链接:

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/random-flip-matrix/

【超时】首先想到的是把二位数组一纬话,因为行和列的范围都是10^4,所以行*10^4+列即可。然后把这些坐标存在一个一纬数组中,每次随机选取选的是数组的下标,然后将这个下标下的数和后面没有被选到的数交换,并记录最后一个没被选择过的数的下标end。再次选取时从0到这个下标end中选即可。但是这样会超时,主要原因是初始化时需要行*列个数,即10^8。下面是超时的代码:

class Solution:

    def __init__(self, m: int, n: int):
        self.arr = []
        self.m, self.n = m, n
        for i in range(m):
            for j in range(n):
                self.arr.append(i * 10000 + j)
        self.end = m * n - 1

    def flip(self) :
        import random
        index = random.randint(0, self.end)
        [x, y] = self.arr[index] / 10000, self.arr[index] % 10000
        self.arr[index], self.arr[self.end] = self.arr[self.end], self.arr[index]
        self.end -= 1
        return [int(x), y]

    def reset(self) -> None:
        self.end = self.m * self.n - 1

【优化】那么这个一纬数组如何优化呢,显然可以用字典来保存,因为最初是初始化为和自身有关的数,所以字典在初始化时可以不填值,把填初始值的操作延后在每个数的第一次随机取数中。

class Solution:

    def __init__(self, m: int, n: int):
        self.arr = {}
        self.m, self.n = m, n
        self.end = m * n - 1

    def flip(self) :
        import random
        index = random.randint(0, self.end)
        select = self.arr.get(index, index)
        [x, y] = select / self.n, select % self.n
        self.arr[index] = self.arr.get(self.end, self.end) #这里特别要注意!
        #因为self.end前面可能被抽到过!所以这里要把index中更新为self.end修改后的值!!
        self.end -= 1
        return [int(x), y]

    def reset(self) -> None:
        self.arr = {}
        self.end = self.m * self.n - 1

这其实是昨天的每日一题,不是昨天不想写,实在是给干懵了 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值