簡體   English   中英

最小化二維數組中javascript中的總和

[英]minimize of sum in javascript in two dimension array

我正在嘗試解決以下問題,為什么我的一個測試用例失敗了?

給定填充了非負數的 amxn 網格,找到一條從左上角到右下角的路徑,該路徑最小化沿其路徑的所有數字的總和。

注意:您只能在任何時間點向下或向右移動。

Input:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.


/**
 * @param {number[][]} grid
 * @return {number}
 */
var minPathSum = function(grid) {
      let firstRow = 0,
        firstColumn = 0,
        endColumn = 0,
        endRow = 0;
    if(grid.length === 1){
        return grid[0][0]
    }

    let firstArray = grid[0];
    let endArray = grid[grid.length - 1];
    firstArray.forEach((i) => firstRow += i);
    endArray.forEach((i) => endRow += i);
    for (let i = 1; i < grid.length - 1; i++) {
        firstColumn += grid[i].shift();
        endColumn += grid[i].pop()
    }
    let cornEdge = grid[grid.length - 1].pop();
    let firstElemt = grid[0].shift();
    if (firstRow + endColumn + cornEdge> firstElemt + firstColumn + endRow) {
        return firstElemt+ firstColumn + endRow
    } else {
        return firstRow + endColumn +cornEdge
    }
};

失敗的測試用例

Input
[[1,2,5],[3,2,1]]
Output
7
Expected
6

從我的角度來看,上面的期望是錯誤的嗎? 使用1->3->2->1應該是7但它是six

你應該這樣做:

 function min(array){ return Math.min(...array); } function sum(array){ return array.reduce((a, c)=>a+=c); } function sumsMin(arrayOfArrays){ const sums = []; arrayOfArrays.forEach(a=>{ sums.push(sum(a)); }); return min(sums); } console.log(sumsMin([[1,2,5],[3,2,1]]));

這是解決問題的蠻力解決方案。 它將通過數組遞歸迭代每個可能的路徑,並返回找到的最小值。

不幸的是,雖然它適用於問題中提出的兩個測試用例,但對於更復雜的用例,它超出了Leetcode的運行時執行限制; 盡管它仍然會產生答案。 例如:

minPathSum([
    [3,8,6,0,5,9,9,6,3,4,0,5,7,3,9,3],
    [0,9,2,5,5,4,9,1,4,6,9,5,6,7,3,2],
    [8,2,2,3,3,3,1,6,9,1,1,6,6,2,1,9],
    [1,3,6,9,9,5,0,3,4,9,1,0,9,6,2,7],
    [8,6,2,2,1,3,0,0,7,2,7,5,4,8,4,8],
    [4,1,9,5,8,9,9,2,0,2,5,1,8,7,0,9],
    [6,2,1,7,8,1,8,5,5,7,0,2,5,7,2,1],
    [8,1,7,6,2,8,1,2,2,6,4,0,5,4,1,3],
    [9,2,1,7,6,1,4,3,8,6,5,5,3,9,7,3],
    [0,6,0,2,4,3,7,6,1,3,8,6,9,0,0,8],
    [4,3,7,2,4,3,6,4,0,3,9,5,3,6,9,3],
    [2,1,8,8,4,5,6,5,8,7,3,7,7,5,8,3],
    [0,7,6,6,1,2,0,3,5,0,8,0,8,7,4,3],
    [0,4,3,4,9,0,1,9,7,7,8,6,4,6,9,5],
    [6,5,1,9,9,2,2,7,4,2,7,2,2,3,7,2],
    [7,1,9,6,1,2,7,0,9,6,6,4,4,5,1,0],
    [3,4,9,2,8,3,1,2,6,9,7,0,2,4,2,0],
    [5,1,8,8,4,6,8,5,2,4,1,6,2,2,9,7]
]);

// 83 = 3+0+8+2+2+3+3+3+1+0+0+0+2+0+2+5+0+2+0+5+4+1+3+3+8+3+3+3+5+2+0+0+7

 const minPathSum = function(grid) { let maxX = grid[0].length - 1; let maxY = grid.length - 1; return mapPath(grid, 0, 0, maxX, maxY, 0); }; const mapPath = function(grid, x, y, maxX, maxY, length) { const value = grid[y][x]; if (x === maxX && y === maxY) { return length + value; } const minX = (x < maxX) ? mapPath(grid, x + 1, y, maxX, maxY, length + value) : Infinity; const minY = (y < maxY) ? mapPath(grid, x, y + 1, maxX, maxY, length + value) : Infinity; return Math.min(minX, minY); }; console.log(minPathSum([[1,3,1],[1,5,1],[4,2,1]])); console.log(minPathSum([[1,2,5],[3,2,1]]));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM