昨天的題目因為是 Hard 沒解出來,只好跳過來寫今天的 Easy。
在初看題目時因為英文不太好,一下子沒看出要做什麼,但是實際上問題不難,有點 Mask 的概念,就是在一個大 Matrix 中找出小 Mask 中最大的數字,取出後再把他放入另一個 Array Matrix 後,就是答案。
Original problem link: 2373. Largest Local Values in a Matrix
一開始讓我稍微思考的東西是他的答案要求的大小,由於 Mask 的固定大小為 3*3 ,然後回傳的結果一開始給的 Matrix 是 4*4,答案是 2*2,而 5*5 時則是 3*3。後來看起來因為 Mask 是固定的,所以回傳應該也是所以解答時就不考慮了
因為題目是 Easy 所以也沒有考慮太多,很直觀地去解答。直接用歷遍的方式,針對 Mask 的大小去限制後,再把 Mask 的內容也歷遍一次找出最大值,最終還是很順利地通過答案。
Sample code
/** * @param {number[][]} grid * @return {number[][]} */ var largestLocal = function (grid) { let gWidth = grid[0].length let gHeight = grid.length let newGrid = []; // gWidth - 2 & gHeight - 2 for (let y = 0; y < gHeight - 2; y++) { newGrid.push(new Array()); for (let x = 0; x < gWidth - 2; x++) { newGrid[y].push(getMaxValueInMatrix(grid, x, y)); } } return newGrid; }; var getMaxValueInMatrix = function (grid, x, y) { let max = 0; for (let j = y; j < y + 3; j++) { for (let i = x; i < x + 3; i++) { max = grid[j][i] >= max ? grid[j][i] : max } } return max; }
這裡我把第二個功能獨立寫出來,理論上是可以寫一起的但是可能會導致太多迴圈讓程式不好理解,但也可能會極小幅的影響效能的量,只是目的是為了解答而已所以就不特別去思考了
後來我簡單的改寫了 getMaxValueInMatrix 的方法,概念只是先把 2D array 轉換成 1D 後再用取最大值的方法拿到結果,而不是每一次都要比較,相對來說可能讓速度快了一點(但記憶體用量不變),而結果確實也有稍微加快了一些些
var getMaxInMatrix2 = function (grid, x, y) { let convert1dg = [] for (let j = y; j < y + 3; j++) { for (let i = x; i < x + 3; i++) { convert1dg.push(grid[j][i]); } } return Math.max( ... convert1dg); }
沒有留言:
張貼留言