LeetCode519 隨機翻轉矩陣

2021-10-10 11:33:21 字數 1168 閱讀 2738

因為n_rows和n_cols最大能到104,所以不能開二維陣列,因為那樣空間複雜度回到108。

題目說了呼叫flip和reset的次數加起來不會超過1000次,所以矩陣是比較稀疏的,我們只需要記錄所有1的位置即可。

我們可以用乙個雜湊表記錄所有1的位置。為了方便,我們把二維的位置對映到乙個int變數,雜湊表中只記錄這個int變數,

比如,如果位置是第r行第c列,那麼我們得到:pos = r * cols + c,其中cols是二維矩陣的列數(即n_cols), pos是將對映到一維空間的下標。

隨機翻轉乙個0為1的時候,我們只要找出乙個不為1(即雜湊表中沒記錄過的)位置pos = rand() % capacity,將這個位置記錄到雜湊表中(其中capacity是矩陣的大小,即n_rows * n_cols),

並且求出這個位置對應的二維矩陣的行號: r = pos / cols, 列號: c = pos % cols,將作為filp()函式的返回值即可。

reset()方法只需要將雜湊表clear即可,表示當前沒有記錄矩陣中的任何位置的值為1。

**如下:

using ll = long long;

class solution

vectorflip() while(hash.count(pos) != 0);

hash.insert(pos);

r = pos / cols; // pos對應的二維矩陣中的行號r是pos / cols

c = pos % cols; // pos對應的二維矩陣中的列號c是pos % cols

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();

*/

519 隨機翻轉矩陣

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

LeetCode 隨機翻轉矩陣

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

LeetCode 整數翻轉

中文版無需翻牆哦!給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 注意 假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 231,231 1 請根據...