zoukankan      html  css  js  c++  java
  • [LeetCode] Minimum Path Sum

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

    Note: You can only move either down or right at any point in time.

    如果不是必须用stack,尽量不要用stack计算,因为总是会Time Limit Exceeded,就像下面代码:

    class Solution {
    public:
        int minPathSum(vector<vector<int> > &grid) {
            
            int m = grid.size();
            if(m<=0)
                return 0;
            int n = grid[0].size();
            stack<pair<pair<int,int>,int>> s;
            pair<int,int> temp(0,0);
            pair<pair<int,int>,int> rowCol_PathSum(temp,grid[0][0]);//存放行列值,以及从右上到此位置的PathSum值
            s.push(rowCol_PathSum);
    
            int minPaSum = -1;
            int row = 0,col = 0;
            while(!s.empty()){
               rowCol_PathSum = s.top();
               s.pop();
               row = rowCol_PathSum.first.first;
               col = rowCol_PathSum.first.second;
               int pathSum = rowCol_PathSum.second;
               if(row==m-1 && col == n-1)
               {
                   if(minPaSum==-1 || rowCol_PathSum.second<minPaSum)
                       minPaSum =  pathSum;
                    continue;
               }
               if(row<m-1)
               {
                  rowCol_PathSum = make_pair(make_pair(row+1,col),pathSum+grid[row+1][col]);
                  s.push(rowCol_PathSum);
               }
               if(col<n-1)
               {
                  rowCol_PathSum = make_pair(make_pair(row,col+1),pathSum+grid[row][col+1]);
                  s.push(rowCol_PathSum);
               }
            }//end while
            return minPaSum;
        }
    };

    看下面的方法,只需遍历一遍整个数组。DP

    思路:定义一个与原数组一样大小的数组,数组(i,j)位置记录从(0,0)到(i,j)最小路径和,则要计算的从左上到右下的最小路径和就是所定义数组的右下角的元素:

    class Solution {
    public:
        int minPathSum(vector<vector<int> > &grid) {
    
            vector<vector<int> > minPathSumm = grid;
            int row = grid.size();
            if(row<=0)
                return 0;
            int col = grid[0].size();
    
            int i = 1;
            while(i<col)
            {
              minPathSumm[0][i] = grid[0][i]+minPathSumm[0][i-1];
              i++;
            }
            int j=1;
            while(j<row)
            {
              minPathSumm[j][0] = grid[j][0]+minPathSumm[j-1][0];
              j++;
            }
    
    
            for(int i=1;i<row;i++)
            {
               for(int j=1;j<col;j++)
               {
                  minPathSumm[i][j] = min(minPathSumm[i-1][j],minPathSumm[i][j-1])+grid[i][j];
               
               
               }
            }
            return minPathSumm[row-1][col-1];
        }
    };
  • 相关阅读:
    Java使用Apache Commons Exec运行本地命令行命令
    Win10安装PostgreSQL9.6
    软件工程学习笔记——软件工具
    软件工程学习笔记——软件过程模型
    软件工程学习笔记——软件过程
    软件工程学习笔记——软件生存周期
    软件工程学习笔记——软件工程基本原理
    MySQL学习笔记——MySQL5.7的启动过程(一)
    Windows下免费的屏幕录制软件——EV录屏——推荐
    SecureCRT 8.1破解方式
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3869048.html
Copyright © 2011-2022 走看看