日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 519. 随机翻转矩阵(哈希) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 題目

題中給出一個 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 沒有參數,參數總會以列表形式給出,哪怕該列表為空

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/random-flip-matrix
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

類似題目:LeetCode 398. 隨機數索引(概率)

2.1 超時解

  • 矩陣很大的時候,翻得時候效率很低,會碰到翻過的,還要去重新翻
class Solution { //超時vector<int> grid;int m, n;int x, y, pos; public:Solution(int n_rows, int n_cols) {grid = vector<int> (n_rows*n_cols, 0);m = n_rows;n = n_cols;}vector<int> flip() {do{pos = rand()%(m*n);}while(grid[pos] == 1);grid[pos] = 1;return {pos/n, pos-pos/n*n};}void reset() {grid = vector<int> (m*n, 0);} };

2.2 轉一維,每次縮小范圍

  • 記錄總共的元素個數N,隨機獲取 0 ~ N-1 的 pos
  • 如果map中有key = pos,則 pos = map[pos],如果沒有,pos就是pos
  • 還需要把當前取的位置的 map的 value 更新為最后一個位置的,下一輪,最后那個位置就跳過了
class Solution {unordered_map<int,int> map;int m, n, num;int x, y, pos, prev; public:Solution(int n_rows, int n_cols) {m = n_rows;n = n_cols;num = m*n;}vector<int> flip() {if(num == 0) return {};pos = rand()%(num);num--;//下一輪,減少一個數if(map.count(pos))//map包含pos的key{prev = pos;//記錄當前pospos = map[pos];//真實的取走的posif(!map.count(num))//把最后一個位置的數換到當前map[prev] = num;else//如果最后一個位置有map值,用其值替換map[prev] = map[num];}else//map不包含pos的key{ //pos就是當前位置,只需把末尾的數替換到當前,同上if(!map.count(num))map[pos] = num;elsemap[pos] = map[num];}x = pos/n;y = pos-x*n;return {x, y};}void reset() {num = m*n;map.clear();} };

36 ms 18.6 MB

總結

以上是生活随笔為你收集整理的LeetCode 519. 随机翻转矩阵(哈希)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。