每日一题
130.开始想的就是bfs,找到每个O,依次作为起始节点开始bfs,但是写着写着发现太费劲了,也没想到很好的办法避免重复bfs(就是说已经被扫到过证明是包围或者未被包围的O又被当做起始节点开始遍历了)
答案提供了非常好的方法,从边上往里搜,而不是从里往外搜直到碰到边界。这就避免了重复搜索的问题,因为边上的O节点毕竟是相对较少的。
bfs,dfs都可以解决这个问题。
还有并查集,详细题解见下。
https://leetcode-cn.com/problems/surrounded-regions/solution/bfsdi-gui-dfsfei-di-gui-dfsbing-cha-ji-by-ac_pipe/
746.我的题解(我只能给最简单的东西生产垃圾题解)
此处撰写解题思路
1.首先是理解题意
读完这道题我突然就想到了马里奥,每个台阶会有地刺或者岩浆让他掉血,问如何能掉最少的血通过关卡(评论区里每到一步就要吃规定的shit的解释也很清晰明了)。
2.题目描述也是很别扭,不如说有个n+2规模的数组分别代表每个台阶,头和尾两个都为0,分别代表起点和终点,就像实际生活中的台阶的最上面和最下面啊也分别是平台。
明白这些题目就很简单了,跟斐波那契数列的思想差不多,m(i) = cost(i) + Math.min(m(i-1),m(i-2));初始的m(0),m(1)要特殊表示一下,最后,假如从倒数第二阶一下迈两步到顶的费用和倒数第一阶迈一步的费用中挑最小值返回。
代码
class Solution {
public int minCostClimbingStairs(int[] cost) {
int[] f = new int[cost.length];
f[0] = cost[0];
f[1] = cost[1];
for(int i = 2;i<cost.length;i++) { //注意i从2开始,f[0],f[1]要预先初始化
f[i] = cost[i]+Math.min(f[i-1], f[i-2]);
}return Math.min(f[cost.length-1], f[cost.length-2]);
}
}
作者:xiao-xiao-guai-jiang-jun-2
链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs/solution/ma-li-ao-ru-he-neng-diao-zui-shao-de-xie-tong-guan/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1025
厉害的数学题
有时间可以拿去骗小孩的钱