题目
攒青豆
这题目就是lc题目 接雨水改了一下,解法忘记了。后面又去复习了下,主要解法有三种
- 双指针法
- 动态规划
- 单调栈
其实我觉得双指针和动态规划更好理解,本质上就是想办法模拟,找到木桶的短板就行了。
双指针相当于是动态的优化版本
维护两个指针 left 和 t right,以及两个变量 leftMax 和 rightMax,初始时 left = 0 , right = n−1 , leftMax = 0 , rightMax = 0 left=0,right=n−1,leftMax=0,rightMax=0。 指针left 只会向右移动,指针 right 只会向左移动,在移动指针的过程中维护两个变量 leftMax 和 rightMax 的值。
当两个指针没有相遇时,进行如下操作: 使用 height[left] 和 height[right] 的值更新 leftMax 和 rightMax 的值;
如果 height [ left ] < height [ right ],则必有 leftMax < rightMax ,下标 left 处能接的雨水量等于 leftMax − height [ left ] ,将下标 left 处能接的雨水量加到能接的雨水总量,然后将left 加 1;
如果 height [ left ] ≥ height [ right ] ,则必有 leftMax≥rightMax,下标 right 处能接的雨水量等于 rightMax − height [ right ] ,将下标 right 处能接的雨水量加到能接的雨水总量,然后将 right 减 1。
寻友之旅
可以使用广度优先搜索(BFS)来解决这个问题。将小青的当前位置作为起点,小码的位置作为终点,然后从起点开始搜索。
具体实现可以使用一个队列来存储当前所有可以到达的位置,每次从队列中取出第一个位置,然后把它能到达的位置加入队列。如这里我使用一个数组来记录每个节点到达起始节点n的距离。使用一个标记数组来记录每个节点是否被遍历过。
每次从队列中取出第一个节点,将其周围未被遍历过的节点加入队列并将其标记为已遍历。如果当前节点是终点,则代表遍历结束,否则应该返回 -1
所谓广度优先搜索,就是从图中的某个顶点出发,寻找紧邻的、尚未访问的顶点,找到多少就访问多少,然后分别从找到的这些顶点出发,继续寻找紧邻的、尚未访问的顶点。
当从某个顶点出发,所有和它连通的顶点都访问完之后,广度优先搜索算法会重新选择一个尚未访问的顶点(非连通图中就存在这样的顶点),继续以同样的思路寻找未访问的其它顶点。直到图中所有顶点都被访问,广度优先搜索算法才会结束执行。
参考: