LeetCode 隨機翻轉矩陣

2021-09-17 00:24:54 字數 1831 閱讀 9298

題中給出乙個 n 行 n 列的二維矩陣 (n_rows,n_cols),且所有值被初始化為 0。要求編寫乙個 flip 函式,均勻隨機的將矩陣中的 0 變為 1,並返回該值的位置下標 [row_id,col_id];同樣編寫乙個 reset 函式,將所有的值都重新置為 0。盡量最少呼叫隨機函式 math.random(),並且優化時間和空間複雜度。

注意:

1.1 <= n_rows, n_cols <= 10000

2. 0 <= row.id < n_rows 並且 0 <= col.id < n_cols

3.當矩陣中沒有值為 0 時,不可以呼叫 flip 函式

4.呼叫 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 沒有引數,引數總會以列表形式給出,哪怕該列表為空

思路分析:剛開始吧,想著直接使用二維vector容器儲存矩陣資訊,但是超時了。不難發現這道題的reset操作需要重建矩陣,或者將原來為1的元素翻轉,這樣非常慢。那我們可不可以逆向思維,只儲存為1的點,當進行reset時,只要清除之前記錄的資訊即可。

class

solution

vector<

int>

flip()

)== myset.

end())

);//新增到集合中

return;}

}}void

reset()

};/** * your solution object will be instantiated and called as such:

* solution* obj = new solution(n_rows, n_cols);

* vectorparam_1 = obj->flip();

* obj->reset();

*/

那我們如何優化rand使用的次數呢?我們可以每次只用一次rand() % size,然後將它拆分為行、列

class

solution

vector<

int>

flip()

;//最後將ans拆分成row,col

LeetCode519 隨機翻轉矩陣

因為n rows和n cols最大能到104,所以不能開二維陣列,因為那樣空間複雜度回到108。題目說了呼叫flip和reset的次數加起來不會超過1000次,所以矩陣是比較稀疏的,我們只需要記錄所有1的位置即可。我們可以用乙個雜湊表記錄所有1的位置。為了方便,我們把二維的位置對映到乙個int變數,...

519 隨機翻轉矩陣

題中給出乙個n行n列的二維矩陣 n rows,n cols 且所有值被初始化為 0。要求編寫乙個flip函式,均勻隨機的將矩陣中的 0 變為 1,並返回該值的位置下標 row id,col id 同樣編寫乙個reset函式,將所有的值都重新置為 0。盡量最少呼叫隨機函式 math.random 並且...

翻轉矩陣後的得分(LeetCode)

題目鏈結 有乙個二維矩陣 a 其中每個元素的值為 0 或 1 移動是指選擇任一行或列,並轉換該行或列中的每乙個值 將所有 0 都更改為 1,將所有 1 都更改為 0。在做出任意次數的移動後,將該矩陣的每一行都按照二進位制數來解釋,矩陣的得分就是這些數字的總和。返回盡可能高的分數。示例 輸入 0,0,...