題中給出乙個 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,...