算法设计Week13 LeetCode Algorithms Problem #64 Minimum Path Sum
2017-05-18 17:19
375 查看
题目描述:
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.
题目分析:
本题其实也是前面#62题的变形,不过这回每一个格子都有了权重。延续#62中的想法,我们可以很容易得到状态方程:pathSum[j] = grid[i - 1][j - 1] + min(pathSum[j - 1], pathSum[j])
在计算的过程中,需要注意两个特殊情况:一个是
i == 1的时候,也就是在计算网格第一行的数值时,由于
pathSum[j]均为0,而
pathSum[j - 1]为已经计算出的权重。我们想要的是
pathSum[j - 1]。因此这时的状态方程为
pathSum[j] = grid[i - 1][j - 1] + pathSum[j - 1]
而在
j == 1的时候,由于由于
pathSum[j - 1]均为0,而
pathSum[j]为已经计算出的权重。我们想要的是
pathSum[j]。因此这时的状态方程为
pathSum[j] = grid[i - 1][j - 1] + pathSum[j]。
整个算法的时间复杂度为O(n2),空间复杂度为O(n)。
实现代码:
class Solution { public: int minPathSum(vector<vector<int>>& grid) { int row = grid.size(); int column = row ? grid[0].size() : 0; vector<int> pathSum(column+1); for(int i = 1; i <= row; i++){ for(int j = 1; j <= column; j++){ if(i == 1){ pathSum[j] = grid[i - 1][j - 1] + pathSum[j - 1]; }else if(j == 1){ pathSum[j] = grid[i - 1][j - 1] + pathSum[j]; }else{ pathSum[j] = grid[i - 1][j - 1] + min(pathSum[j - 1], pathSum[j]); } } } return pathSum[column]; } };
相关文章推荐
- 【算法设计作业】week13
- 13、设计一个算法,找出二叉树上任意两个结点的最近共同父结点。
- 算法竞赛入门经典(第二版) 刘汝佳-第八章 高效算法设计 例题(13/19)
- 算法分析与设计week04--45.Jump Game II
- 【算法设计作业】week16
- 【算法设计作业】week14
- 每天一道算法题13 设计包含min函数的栈
- 算法分析与设计week11--744. Find Smallest Letter Greater Than Target
- 算法分析与设计week03--122.Best Time to Buy and Sell Stock II
- Week 13算法分析作业
- 算法分析与设计-13-活动安排问题的贪心算法
- 算法分析与设计课程13——413. Arithmetic Slices
- 算法设计Week15 LeetCode Algorithms Problem #120 Triangle
- 算法分析与设计week04--55.Jump Game
- 算法分析与设计week01——1.Two Sum
- OpenCV 2 学习笔记(13): 算法的基本设计模式<4> :使用Model-View-Controller模式创建一个应用程序
- 算法设计Week10 LeetCode Algorithms Problem #213 House Robber II
- 算法设计与应用基础系列13
- (算法分析Week13)Combination Sum IV[Medium]
- 算法分析与设计week09--53. Maximum Subarray