今日题目:
今日总结
dp第二天。都是不同路径,经典的dp题目。主要注意下在golang中怎么合理地开辟二维数组。
62. 不同路径
要点
- 没啥说的,和爬楼梯类似
- 这里要注意初始化,由于机器人只能向左和向下移动,所以最左的边和最上的边都只会有一条路径
- golang不能直接给dp开辟m*n的空间,需要分别开辟
代码:
func uniquePaths(m int, n int) int {
dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
dp[i][0] = 1
}
for j := 0; j < n; j++ {
dp[0][j] = 1
}
for i:=1;i <m; i++{
for j:=1; j <n;j++{
dp[i][j] = dp[i-1][j]+dp[i][j-1]
}
}
return dp[m-1][n-1]
}
63. 不同路径 II
要点:
- 比前一题多了个障碍物,但是核心思想不变。
- 这里要考虑到上边界和左边界初始化时,当出现了障碍物,就意味着后面的dp元素都是0.
- 注意开辟空间和赋值要分开。因为遇到障碍物break会导致后面的空间没有开辟。
func uniquePathsWithObstacles(obstacleGrid [][]int) int {
m := len(obstacleGrid)
if m == 0 {
return 0
}
n := len(obstacleGrid[0])
if n == 0 {
return 0
}
// if obstacleGrid[0][0] == 1 {
// return 0
// }
dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
}
for i := 0; i < m; i++ {
if obstacleGrid[i][0] == 1 {
break
}
dp[i][0] = 1
}
for j := 0; j < n; j++ {
if obstacleGrid[0][j] == 1 {
break
}
dp[0][j] = 1
}
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
if obstacleGrid[i][j] == 1 {
dp[i][j] = 0
} else {
dp[i][j] = dp[i-1][j] + dp[i][j-1]
}
}
}
return dp[m-1][n-1]
}
225. 用队列实现栈
要点:
- 这种自定义数据结构的题目不要局限于题目给出的方法。
- 使用两个队列时,要理解Move操作。实质上就是将queue1的元素反向放入queue2再放回去。
- 使用一个队列时,要点就是在弹出时将队列的末尾元素(即栈的top元素)之前的所有元素放置在末尾元素的后方从而让它成为队列的首位,就能进行pop了。
- 注意题目要求是使用队列的基本操作,所以不能够直接从队列末尾弹出元素。