519. 随机翻转矩阵

给你一个 m x n 的二元矩阵 matrix ,且所有值被初始化为 0 。请你设计一个算法,随机选取一个满足 matrix[i][j] == 0 的下标 (i, j) ,并将它的值变为 1 。所有满足 matrix[i][j] == 0 的下标 (i, j) 被选取的概率应当均等。

尽量最少调用内置的随机函数,并且优化时间和空间复杂度。

实现 Solution 类:

  • Solution(int m, int n) 使用二元矩阵的大小 m 和 n 初始化该对象
  • int[] flip() 返回一个满足 matrix[i][j] == 0 的随机下标 [i, j] ,并将其对应格子中的值变为 1
  • void reset() 将矩阵中所有的值重置为 0
示例:输入
["Solution", "flip", "flip", "flip", "reset", "flip"]
[[3, 1], [], [], [], [], []]
输出
[null, [1, 0], [2, 0], [0, 0], null, [2, 0]]解释
Solution solution = new Solution(3, 1);
solution.flip();  // 返回 [1, 0],此时返回 [0,0]、[1,0] 和 [2,0] 的概率应当相同
solution.flip();  // 返回 [2, 0],因为 [1,0] 已经返回过了,此时返回 [2,0] 和 [0,0] 的概率应当相同
solution.flip();  // 返回 [0, 0],根据前面已经返回过的下标,此时只能返回 [0,0]
solution.reset(); // 所有值都重置为 0 ,并可以再次选择下标返回
solution.flip();  // 返回 [2, 0],此时返回 [0,0]、[1,0] 和 [2,0] 的概率应当相同

提示:

  • 1 <= m, n <= 104
  • 每次调用flip 时,矩阵中至少存在一个值为 0 的格子。
  • 最多调用 1000 次 flip 和 reset 方法。

解题思路

对于矩阵的每个位置都使用编号代替,编号范围为[0,n*m-1],使用set存储已经被标记为1的位置,每次我们生成一个该区间内的随机数,检查该编号对应的位置是否为1,如果为1的话,则重新生成随机数,否则返回该随机数对应矩阵位置的下标,并且加入set中。

代码

class Solution {public:int mm,nn;unordered_set<int> set;Solution(int m, int n) {this->mm=m;this->nn=n;}vector<int> flip() {int cur=rand()%(nn*mm);while (set.count(cur)>0){cur=rand()%(nn*mm);}set.insert(cur);return {cur/nn,cur%nn};}void reset() {set.clear();}
};
/*** Your Solution object will be instantiated and called as such:* Solution* obj = new Solution(m, n);* vector<int> param_1 = obj->flip();* obj->reset();*/

519. 随机翻转矩阵相关推荐

  1. java水平翻转矩阵_Java实现 LeetCode 519 随机翻转矩阵

    519. 随机翻转矩阵 题中给出一个 n 行 n 列的二维矩阵 (n_rows,n_cols),且所有值被初始化为 0.要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位 ...

  2. Java实现 LeetCode 519 随机翻转矩阵

    519. 随机翻转矩阵 题中给出一个 n 行 n 列的二维矩阵 (n_rows,n_cols),且所有值被初始化为 0.要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位 ...

  3. 【解题报告】Leecode 519. 随机翻转矩阵——Leecode每日一题系列

    今天是坚持每日一题打卡的第二十六天 题目链接:https://leetcode-cn.com/problems/random-flip-matrix/solution/ 题解汇总:https://zh ...

  4. LeetCode 519. 随机翻转矩阵(哈希)

    1. 题目 题中给出一个 n_rows 行 n_cols 列的二维矩阵,且所有值被初始化为 0. 要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位置下标 [row_id ...

  5. leetcode 519. Random Flip Matrix | 519. 随机翻转矩阵(洗牌算法Fisher–Yates shuffle)

    题目 https://leetcode.com/problems/random-flip-matrix/ 题解 看了答案: 洗牌算法 Fisher–Yates shuffle Fisher–Yates ...

  6. 【LeetCode笔记 - 每日一题】519. 随机翻转矩阵(Java、随机、双指针)

    文章目录 题目描述 思路 && 代码 题目描述 又是涉及到均等概率的随机- 思路 && 代码 用的题解区三叶的代码-写得是真的好!不论题目,但抄一遍代码都能觉得有收获! ...

  7. 【数据结构与算法】之深入解析“随机翻转矩阵”的求解思路与算法示例

    一.题目要求 给你一个 m x n 的二元矩阵 matrix ,且所有值被初始化为 0,请你设计一个算法,随机选取一个满足 matrix[i][j] == 0 的下标 (i, j),并将它的值变为 1 ...

  8. python图像增强之随机翻转或随机旋转

    假设输入的图像数据为img,标签label组成为classid.x.y.w.h,因此labels维度为Nx5.假设旋转前的坐标和尺寸为x0.y0.w0.h0.x.y.w.h均为归一化后坐标,即已经除以 ...

  9. flipdim--按指定维数翻转矩阵

    [功能简介]按指定维数翻转矩阵. [语法格式] B=flipdim(A,dim) 按指定维数翻转矩阵,flipdim(A,1)=flipud(A),且flipdim(A,2) =fliplr(A). ...

最新文章

  1. 硬核教程:五步掌握用VSCode进行高效Python开发
  2. BZOJ3799 : 字符串重组
  3. J2EE和Java EE
  4. Gym 100431E Word Cover 题解:KMP上跑dp
  5. CentOS 编译安装python3.6
  6. 19生成材料清单_SOLIDWORKS 钣金装配体材料明细表扩展应用
  7. (TTSR)Learning Texture Transformer Network for Image Super-Resolution
  8. linux必须运行在enforcing,设置 Selinux环境为 Enforcing模式
  9. ALGO-146_蓝桥杯_算法训练_4-2找公倍数
  10. 过山车大亨3白金版 mac版(模拟经营类游戏)支持m1
  11. jquery中attr() 和 prop()的区别
  12. 2021年大学计算机基础,2021年大学计算机基础试题题库及答案-20210418080659.doc-原创力文档...
  13. IntelliJ IDEA导出jar包
  14. linux中fork() 函数详解
  15. java 中国标准时间_「标准时间」js代码,中国标准时间转换为yyyy-MM-dd - seo实验室...
  16. 滑模鲁棒控制(hm-3)
  17. 计算机二级c语言题型及考点,全国计算机二级C语言考试题型及考试重点.doc
  18. 中望CAD工具栏消失不见的解决方案
  19. win7 C盘满如何清理
  20. 2019年新版新媒体运营学习路线,附完整视频+工具+运营经验

热门文章

  1. Linux下基于socket和多线程的聊天室小程序
  2. System V IPC之消息队列
  3. 字符串函数参数传入传出(去空格)
  4. Python3正则表达式
  5. Java面试题及答案,mysql类型
  6. 使用Docker快速搭建Tensorflow开发环境
  7. 关于position的四个标签
  8. 三维空间两直线/线段最短距离、线段计算算法 【转】
  9. 【每日scrum】NO.5
  10. 小小c#算法题 - 3 - 字符串语句反转