Depth-first Search深度优先搜索专题4

576. Out of Boundary Paths

思路:这道题目难倒了我。最直接的思路是暴力搜索。要注意的问题1是需要仔细观察Example2,轨迹不同意思是可以从A点到B点,再从B点到A点也可以,只要step够用。所以暴力搜索,在(i,j)点在步骤允许范围内肆意地向4个方向扩散。退出条件是if (i == -1 || j == -1 || i == m || j == n),计数退出。这样会超时。
我知道该用动态规划了,但是找不出动态方程。
动态规划:思路是这样的。例如输入为 m=2,n=3,N=3,i=0,j=1
这里写图片描述
如果走1不就能走出边界的话,按箭头走。count+1。因为(0,1)只有一个方向能走出边界,而且到达(0,1)的路径只有1条。
接下来考虑走2步能走出边界的方法。从上图的位置(0,1)到下图。
这里写图片描述
count需要分别加上:2,2,1。解释如下:
从(0,1)到(0,0)只有一条路径,(0,0)有2个方向走出边界,所以count+2;
从(0,1)到(0,2)有1条路径,(0,2)有2个方向走出边界,所以count+2;
从(0,1)到(1,1)有1条路径,(1,1)有1个方向走出边界,所以count+1。

接下来考虑走3步走出边界的方法。从上图(0,0),(1,1),(0,2) 位置开始到下图。
这里写图片描述
有3条路径可以到达(0,1),count+3;
有2条路径可以达到(0,0),count+2*2;
有2条路径可以达到(1,2),count+2*2。
最终得总数是17。
用数组dp存储到达(i,j)有几条路径。每次迭代新的newDP[i][j] = dp[i−1][j]+dp[i+1][j]+dp[i][j−1]+dp[i][j+1];dp是上一轮的dp。
我没完成dp思路,是因为我想的是dp[i][j]表示有多少通过(i,j)能有多少count方向出去,也就是最后的总数。
代码

210. Course Schedule II

思路:与207. Course Schedule类似,只是记录下排课顺序即可。

332. Reconstruct Itinerary

思路:题目一看,和graph相关,和DFS相关。而且要求返回字母序列小的。构建map,对map的value值排序。一个一个输出即可。可是要注意:所有的tickets是需要用完的。有些情况下先使用顺序小的票,不一定能走完。解决方法:dfs函数返回true,如果能走完的情况。接着遇到了问题2:超时.解决:逻辑写错了。
代码

130. Surrounded Regions

思路:难点是题目理解。我理解的题意是:如果O在矩形最外圈,那么它不会被翻转为X;如果有和最外圈的O在垂直方向上或者水平方向上相邻的O,那它也不会被翻转为X。其余的O被翻转为X。这样的话根本用不到DFS、BFS之类的。
实际题目含义是:所有被X包围的O都翻转为X。
这里写图片描述
图中画红色部分的O就是被X包围的。
这里写图片描述
图中就没有被X完全包围的O。

BFS思路:在矩形边上的O肯定没有被X包围。在垂直、水平方向上与此O相邻的O也是不被包围的。可以先把不被包围的O替换为#。把边界的O 递归处理完成之后,剩余的O就是需要替换的。
Union-Find思路:将O分为两组;一组是与dummyNode一组,不改变值的;其他组是需要改变值的。
代码

98. Validate Binary Search Tree

思路:是否有效二叉检索树。DFS的思路。先判断node是否有效,接着判断node的左节点是否有效,判断node的右节点是否有效。只是注意,有效值是一个区间。
代码

778. Swim in Rising Water

思路:例如输入如下图:
这里写图片描述

t=0
    cost=0
    visited[0][0]=true
    可以选择的 1,24;
    选择1,增加耗时1=(1-0)
t=1
    cost+=1
    visited[0][1]=true;
    可以选择的 2,23
    选择2,增加耗时1=(2-1)
t=2
    cost+=1
    visited[0][2]=true;
    可以选择的 3,22

    ….一直走到(n-1,n-1)

每一步都选择最小的,就一定是最小的吗?不一定,没有理论支持。那就需要把所有路径都走一遍。在走的过程中如果发现耗时已经>目前的最小耗时就返回。

结果:超时。

学习1:超时是因为我还没有看到事物的本质。You can swim infinite distance in zero time。可以在瞬时穿过好多个区块。例如下图中。起点时刻就是10,或者说等到t=10才能开始移动。移动的时候,因为9,1,2,0,7都<10<10<script type="math/tex" id="MathJax-Element-1"><10</script>,所以相当于瞬时可以达到这些地方。那就相当于在图中划线的周围找到下一个>10>10的最小值就是下一步要走的区块。

这里写图片描述
    可以考虑的思路是用一个优先队列保存点(i,j)的邻接节点,值小的排在前面。不断弹出,不断加入,直到遇到目标节点。原来题目和代码之间的翻译差距是这么大。好神奇!

学习2:在上一个解决方法中能感觉到是可以把小于10的区块合并成一组。接着找11,再把小于11的相邻元素合并成一组。接着找12,再把小于12的相邻元素合并为一组。最终合并到右下角。这里合并的时候要考虑清楚合并的是元素的值,还是下标。因为最后判断条件不同。在代码swimInWaterV3中合并的是下标,所以最后判断0和N*N-1在同一组,即可退出循环。
这种题目理解和代码,这个等价关系也是令人惊叹。hard类型的题目果然不同凡响。

代码

827. Making A Large Island

思路:对于遇到的每个0,尝试修改为1,用dfs数数面积;取最大的面积值.当grid中没有0的时候,面积为n^2。
学习:将0周围的1分组,可以连续在一起的1分为一组算一次面积。最后再将0周围不同组的面积加起来。找到最大值就是面积。
代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java面试题7 牛客:关于AWT和Swing说法正确的是?

关于AWT和Swing说法正确的是&#xff1f; A Swing是AWT的子类 B AWT在不同操作系统中显示相同的风格 C AWT不支持事件类型&#xff0c;Swing支持事件模型 D Swing在不同的操作系统中显示相同的风格 AWT和Swing都是java中的包。 AWT(Abstract Window Toolkit)&#xff1a;…

bwa比对软件的使用以及其结果文件(sam)格式说明

一、bwa比对软件的使用 1、对参考基因组构建索引 bwa index -a bwtsw hg19.fa # -a 参数&#xff1a;is[默认] or bwtsw&#xff0c;即bwa构建索引的两种算法&#xff0c;两种算法都是基于BWT的&#xff08;BWT search while the CIGAR string by Smith-Waterman alignment.…

java面试题8 牛客:在Web应用程序中,( )负责将HTTP请求转换为HttpServletRequest对象

在Web应用程序中&#xff0c;( )负责将HTTP请求转换为HttpServletRequest对象 A Servlet对象 B HTTP服务器 C Web容器 D JSP网页 首先我们来看看web程序的整个过程 web的基本工作流程 首先&#xff0c;我们先来思考一下我们平常在上网浏览网页时候的场景&#xff0c;…

2018-2019-2-20175225 实验四《Android开发基础》实验报告

一、实验报告封面 课程&#xff1a;Java程序设计 班级&#xff1a;1752班 姓名&#xff1a;张元瑞 学号&#xff1a;20175225 指导教师&#xff1a;娄嘉鹏 实验日期&#xff1a;2019年5月14日 实验时间&#xff1a;13:45 - 21:00 实验序号&#xff1a;实验四 实验名称&#xff…

【小技巧】【Java】 创建指定数目m的Set数组

1. Set[] 并初始化 Set[] sets new Set[m]; //均会指向同一对象 // Arrays.fill(sets,new HashSet()); for(int i 0;i<m;i){sets[i] new HashSet<Integer>();}2. Stream 流 Set[] sets Stream.generate(HashSet::new).limit(m).toArray(Set[]::new); for循环初始…

第七十六期:3000台服务器不宕机,微博广告系统全景运维大法

微博现在日活达到了 2 亿&#xff0c;微博广告是微博最重要且稳定的收入来源&#xff0c;没有之一&#xff0c;所以微博广告系统的稳定性是我们广告运维所有工作中的重中之重。 作者&#xff1a;孙燕来源 微博现在日活达到了 2 亿&#xff0c;微博广告是微博最重要且稳定的收入…

第六章小结

本章&#xff0c;我们学习了图。 首先是图(GRAPH)的定义 一种非线性数据结构&#xff0c;由有穷、非空的点集V(G)和边集E(G)组成。当G中的每条边有方向时&#xff0c;称G为有向图&#xff0c;有向边&#xff08;用一对尖括号<a,b>&#xff09;又称为弧&#xff0c;起始顶…

753 Cracking the Safe

方法一 Hierholzer’s Algorithm 相关概念&#xff1a; 1 欧拉路径&#xff1a;在无向图中&#xff0c;每个边只经过一次&#xff0c;形成的路径。在有向图中&#xff0c;是指每条有向边只使用一次&#xff0c;形成的路径。 2 欧拉回路&#xff1a;欧拉路径是一个环。 3 在…

java面试题9 牛客:不同的服务器之间,哪种通信方式是不可行的

在一个基于分布式的游戏服务器系统中&#xff0c;不同的服务器之间&#xff0c;哪种通信方式是不可行的&#xff08;&#xff09;&#xff1f; A管道 B消息队列 C高速缓存数据库 D套接字 首先看到这道题我是懵逼的&#xff0c;我们分别介绍一下各个的概念 管道为运行在同…

[Leetcode][第77题][JAVA][组合][回溯]

【问题描述】[中等] 【解答思路】 1. 回溯 class Solution {List<List<Integer>> lists new ArrayList<>();public List<List<Integer>> combine(int n, int k) {List<Integer> list new ArrayList<>();backTrace(list, n, k, 0)…

Depth-first Search深度优先搜索专题6

472 Concatenated Words 思路&#xff1a;将词典使用Trie树表示。对于输入的词word&#xff0c;在Trie树上找&#xff0c;当遇到一个isWordtrue的节点&#xff0c;查看剩下部分的词是否在词典中。 例如输入 [“cat”,”cats”,”catsdogcats”,”dog”,”dogcatsdog”,”hipp…

目标检测近5年发展历程概述(转)

目标检测近5年发展历程概述&#xff0c;从R-CNN到RFBNet&#xff08;2013--2018&#xff09;&#xff08;转&#xff09; 2018年09月24日 12:32:02 C小C 【时间】2018.09.24 【题目】目标检测近5年发展历程概述&#xff0c;从R-CNN到RFBNet&#xff08;2013--2018&#xff09; …

[Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

【问题描述】[中等] 【解答思路】 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List;public class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {int …

Depth-first Search深度优先搜索专题7

834 Sum of Distances in Tree 思路&#xff1a;一颗无向的树有N个节点&#xff0c;分别标记为0,1,2,…N-1&#xff0c;有若干条边。结果返回每个节点到其他节点的路径和。 以上面这棵树为例。从节点0到其他点的路径查找过程是&#xff1a;节点0有两条边分别到达子节点1和子节…

[Leetcode][第216题][JAVA][数组之和3][回溯]

【问题描述】[中等] 【解答思路】 回溯 剪树枝 当和超过n 或 个数超过k 1. 正向求和 优化前 class Solution {public List<List<Integer>> ans new LinkedList();public List<List<Integer>> combinationSum3(int k, int n) {dfs(0,k,0,n,1,new L…

第十三期:你不想错过的那些JSON工具

网上有许多出色的免费工具用于JSON格式化、验证、编辑以及转换成其他格式&#xff0c;可供开发人员选择。 作者&#xff1a;布加迪 JSON(JavaScript对象标注)是一种流行的轻量级数据交换格式&#xff0c;在网络上已很常见。 众所周知&#xff0c;JSON让开发人员易于使用&#…

java jvm学习

在并发编程中&#xff0c;多个线程之间采取什么机制进行通信&#xff08;信息交换&#xff09;&#xff0c;什么机制进行数据的同步&#xff1f; 在Java语言中&#xff0c;采用的是共享内存模型来实现多线程之间的信息交换和数据同步的。 线程之间通过共享程序公共的状态&#…

Breadth-first Search(广度优先搜索)专题1

广度优先搜索的定义 广度优先搜索BFS类似于树的层次遍历算法。基本思想是&#xff1a;首先访问顶点v&#xff0c;然后由v出发&#xff0c;依次访问v的各个未被访问过的顶点w1,w2,w3…wn。然后再访问wi(wi是w1,w2,w3…wn中的一个)未被访问过的邻接点。以此类推&#xff0c;直到所…

[Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]

【问题描述】[中等] 【解答思路】 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Deque; import java.util.List;public class Solution {public List<List<Integer>> combinationSum2(int[] can…

Breadth-first Search(广度优先搜索)专题2

743. Network Delay Time 输入&#xff1a;int[][] times times[i] new int[]{v,u,w} 表示从节点v到节点u需要时间w。注意这里是有向图。    int N 节点总数。    int k 起始节点 输出&#xff1a;从节点k到其他各个节点的最短路径和。如果有一个节点不能达到则返回-1。 …