1. 基本思路
首先我们要决定要存储什么历史信息以及用什么数据结构来存储信息。然后是最重要的递推式,就是如从存储的历史信息中得到当前步的结果。最后我们需要考虑的就是起始条件的值。
(0, 0)
到 (i, j)
的路径个数(i, j)
最多只有两个路径:从左面或者从上面(i, j)
,如果可以,那么 f(i, j)
加上左面或者上面的路径个数即可1 | int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { |
f为int型, 为什么会报错 ???
Line 27: Char 65: runtime error: signed integer overflow: 1053165744 + 1579748616 cannot be represented in type 'int' (solution.cpp)
old
,并判断 old
是否与 newColor
相同,如果是,则返回imageold
,并判断 old
是否与 newColor
相同,如果是,则返回imagepair<int, int>
类型,将image[sr][sc]
入队;q
进行遍历,将 q.front()
变为 newColor
,然后,遍历周围的点,符合条件的入队1 | vector<vector<int> > floodFill(vector<vector<int> >& image, int sr, int sc, int newColor) { |
1 | vector<vector<int> > floodFill(vector<vector<int> >& image, int sr, int sc, int newColor) { |
同 733. 图像渲染
1 | void dfs(vector<vector<char>>& grid, int x, int y) |
1 | int numIslands(vector<vector<char>>& grid) { |
vector<int> f
中,并且 vector<int> g
保存:两行中,上面一行与下面相邻两个元素相加之和的最小数组
[4, 1, 8, 3]
[0, 0, 0, 0]
[7, 6, 10, 0]
[7, 6, 10, 0]
- 如果不懂,就自己调试一下吧
- 这里是动态规划,更新的是g和f(首先更新g,接着将g赋值给f)
- 其中f,总是为最后一行最小数的数组:
- 比如:一开始为
[4, 1, 8, 3]
,后来状态转移为:[7, 6, 10, 0]
- 那么
[7, 6, 10, 0]
可以看成最后一行(替换后面两行,依次类推)
1 | int minimumTotal(vector<vector<int> > &triangle) |
1 | int minimumTotal(vector<vector<int>>& triangle) { |
PS:
- 相比于上面的代码,下面的代码删除了
g
- 原因:因为
f[j]
改变,对f[j + 1]
并没有影响,所以就不需要g
了。
1 | int numSquares(int n) { |
1. BFS(宽度有限搜索)
2. DFS(深度有限搜索)
寻找最小
的优势 (最小性)10万
层时就会RE