赞
踩
题目来源:https://leetcode-cn.com/problems/random-flip-matrix/
大致题意:
设计一个类,可以完成如下三个功能:
一开始我想使用一个集合存下所有未被翻转过的的坐标集合,然后翻转时在集合中随机抽取一个数,但是错了,也不知道咋错了。后面又发现这个法子根本行不通,这道题会卡空间复杂度为 O(mn),也就是说申请一个大小为 mn 的数组在最后都会内存超限
只好去看题解,发现这道题的翻转次数在 10^3 以内,使用哈希表存下已经翻转过的位置,就可以减少复杂度
为了方便计算,首先将二维矩阵坐标转换为一维 [i, j] ~ i * n + j
因为哈希表是按照哈希函数计算结果进行索引的,为了保证每个坐标被选中的概率相等,需要做一些处理:
代码:
public class Solution { Map<Integer, Integer> matrix = new HashMap<Integer, Integer>(); int m; int n; int total; public Solution(int m, int n) { total = m * n; this.n = n; this.m = m; } public int[] flip() { Random random = new Random(); // 在 total 个待翻转的坐标中选择一个 int rd = random.nextInt(total--); // 如果之前该坐标已经被选中过,那么选中其对应的值(也就是替换后的坐标) int idx = matrix.getOrDefault(rd, rd); // 放入哈希表 / 更新被选中坐标的替换坐标 为随机数区间的末尾坐标 matrix.put(rd, matrix.getOrDefault(total, total)); // 转换为二维坐标 return new int[]{idx / n, idx % n}; } public void reset() { matrix.clear(); total = m * n; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。