5月 12, 2024

LeetCode practice: 2373. Largest Local Values in a Matrix

 昨天的題目因為是 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);
}


只能說 Easy 果然還是簡單許多,只是個人解答的最大缺點就是太直觀,比較少考慮效率方面的問題,這點要想辦法改善 


沒有留言:

張貼留言