前往
大廳
主題

[leetcode]1632. Rank Transform of a Matrix

♙♲⚙\~O_O~/⚙♲♙ | 2021-08-11 12:00:21 | 巴幣 2 | 人氣 192

題目: 1632. Rank Transform of a Matrix
難度: Hard
目前下列解法的時間複雜度: 我覺得是O(m*n*lg(m*n))可是跑起來不像


題目說明

給一 m*n 的數字矩陣,把數字變成他在那一格的行、列中, rank 較大的那個。
rank 從1開始。
若 i<j 則 rand(i)<rank(j) ( 若 i>j 則 rand(i)>rank(j) )
若 i==j 則 rand(i)==rank(j)
要讓 rank 越小越好,但是 rank 最低為1。


(壓線)解法

1. 先想辦法對相同的數字分類: 彼此有相同的row或column就歸為同一類,若兩類中各有一個點有相同的row或column,則這兩類應視為同一類。
2. 把所有點丟進heap,從最小的開始拿。
3. 每次拿出來的時候,一起看被分為同一類的點,取最大應該要有的rank。
4. 幫這些點、row、column更新rank。
5. return


source code

6. 可惡!又TLE!
7. 雖然過了但是跑起來真的很慢,跟我說到底哪裡爛了好嗎
8. 明明在分類的時候分過的類別(以圖來說是邊)都刪掉了,應該不會找第二次才對,大神路過救救地方渣渣好嗎
9. 噢對了,這份code是可以過的,不要看我上面寫得他好像不會過一樣

創作回應

Not In My Back Yard
「若兩類中各有一個點有相同的row或column,則這兩類應視為同一類」
這邊改用並查集(Union-Find Set)來維護如何?

雖然沒有很仔細地看,但是感覺 buildSet 那邊很慢。不過我不是電神,有可能錯得離譜QQ
2021-08-11 20:53:12
♙♲⚙\~O_O~/⚙♲♙
我試試,雖然我沒寫過disjoint-set
2021-08-11 22:41:28
Not In My Back Yard
因為 buildSet 裡面的 q 會慢慢地擴張到還沒有 push 過的元素,可是這些元素在 idx2map 的 vector 可能儲存與當前格子 pos 等量的格子。
2021-08-11 20:56:18
Not In My Back Yard
所以感覺整個 matrix 在 buildSet 會被重複地掃過相當多次(儘管有將 idx2map 的 vector 清掉)?
2021-08-11 20:57:30
♙♲⚙\~O_O~/⚙♲♙
我也是猜應該是buildSet裡掃了相當多次的問題
但是我真的看不出來有掃很多次
我再想想
2021-08-11 22:41:37

相關創作

更多創作