Re: [閒聊] 每日leetcode已回收

看板Marginalman作者 (是oin的說)時間1年前 (2024/07/21 17:17), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串537/1548 (看更多)
※ 引述 《enmeitiryous (enmeitiryous)》 之銘言: :   2392.build a matrix with condition 給兩個二維陣列 rowconditions, colconditions和一常數k, 其中rowcondition陣列 每一項[a,b]代表a會在b的上方列中, 例如b在i-th row, a就一定只能在0-i-1 th row中, colconditions類似, [a,b]代表a一定在b的左邊col中, 給定1-k的數字回傳 k*k合乎規定的matrix, 如果條件出現矛盾則回傳empty matrix. 怎麼是圖 幹 我吐了 思路: 先想想看要如果只有一條 row的情況 就是要依照他的上下順序關係 要找上下順序關係 就要用Topological sort 我是用kahn's 的方法來找 kahn's 方法簡單說就是 記錄每個節點進入的路徑 indegree 還有他們能到達的地方 然後沒有路徑能到 indegree=0的地方就拿去找 被找到的就 indegree -1 又=0就再拿去找 這樣能夠避免迴圈出現 因為有迴圈的 indegree 永遠不會是0 這樣可以找到他們的順序 然後知道順序就 兩個一起找 丟進去 結束 ```cpp class Solution { public: vector<int> test(vector<vector<int>>& rowConditions , int k) { unordered_map<int,vector<int>> rowsave; vector<int> rowind(k+1,0); vector<int> rowint; queue<int> rowq; for(auto k : rowConditions) { rowsave[k[0]].push_back(k[1]); rowind[k[1]]++; } for(int i = 1 ; i <= k ; i ++) { if(rowind[i]==0)rowq.push(i); } while(!rowq.empty()) { int now = rowq.front(); rowq.pop(); rowint.push_back(now); for(int k : rowsave[now]) { rowind[k]--; if(rowind[k] == 0) { rowq.push(k); } } } return rowint; } vector<vector<int>> buildMatrix(int k, vector<vector<int>>& rowConditions, v ector<vector<int>>& colConditions) { vector<vector<int>> res (k,vector<int>(k,0)); int rlen = rowConditions.size(); int clen = colConditions.size(); vector<int> rowint; vector<int> colint; rowint = test(rowConditions , k); if(rowint.size()<k)return {}; colint = test(colConditions , k); if(colint.size()<k)return {}; for(int i = 0 ; i < k ; i ++) { int jiwp = 0; for(int j = 0 ; j < k ; j ++) { if(colint[j]==rowint[i])jiwp = j; } res[i][jiwp] = rowint[i]; } return res; } }; ``` -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.162.58.218 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1721553455.A.CCA.html
文章代碼(AID): #1cdD8lpA (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1cdD8lpA (Marginalman)