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

473. Matchsticks to Square

思路:有n根长度不一的火柴,这些火柴可以拼接在一起,但不能被折断。这些火柴能够围城一个正方形吗?每个火柴可以并且必须使用一次。分析得到每个边的长度应该是所有火柴长度和的1/4。接下来就是将火柴分组。可以用4个变量或者一个数组记录每组火柴目前已经分配的长度。如果正好分配完成就返回true,否则返回false。
这里的一个小技巧是对输入nums排序。先分配火柴长度长的火柴。这样可以更早地找到不合理分配的情况。
代码

743. Network Delay Time

思路:这是一道关于在图中找从一个顶点到其他顶点的最短路径的问题。我的错误在于忽略了最短路径
思路1:普通的dfs。只是要注意遍历的时候先访问距离短的边。
思路2:Dijkstra’s Algorithm。但是我比较了dfs版本的代码与堆实现版本的代码,认为思路是一样的。只是代码书写结构不同。排序位置不同。它们的耗时确实不同。前者耗时101ms,后者耗时51ms。

 public int networkDelayTime(int[][] times, int N, int K) {int[] costs = new int[N+1];Arrays.fill(costs,-1);Map<Integer, List<int[]>> map = new HashMap<Integer, List<int[]>>();for(int[] a : times){if( map.get(a[0])==null){map.put(a[0],new ArrayList<int[]>());}map.get(a[0]).add(new int[]{a[1],a[2]});}//按dist排序,可以优先选择距离短的边for (int node: map.keySet()) {//(a, b) -> a[0] - b[0]Collections.sort(map.get(node), new Comparator<int[]>(){public int compare(int[] o1, int[] o2) {return o1[1]-o2[1];}});}visitNode(map,costs,K,0);int max = 0;for(int i=1;i<=N;i++){if(costs[i] == -1) return -1;max = Math.max(max, costs[i]);}return max;}public void visitNode(Map<Integer,List<int[]>> timeMap,int[] costs,int node,int cost){if(costs[node]!=-1){if(cost >= costs[node]){return;}}costs[node] = cost;if(timeMap.get(node)!=null){for(int[] edge :timeMap.get(node)){visitNode(timeMap,costs,edge[0],edge[1]+cost);}}}
    public int networkDelayTimeV2(int[][] times, int N, int k) {Map<Integer, List<int[]>> graph = new HashMap<Integer, List<int[]>>();for(int[] a : times){if( graph.get(a[0])==null){graph.put(a[0],new ArrayList<int[]>());}graph.get(a[0]).add(new int[]{a[1],a[2]});}PriorityQueue<int[]> heap = new PriorityQueue<int[]>(N,new Comparator<int[]>(){public int compare(int[] o1, int[] o2) {return o1[1]-o2[1];}});heap.offer(new int[]{k,0});int[] dist = new int[N+1];Arrays.fill(dist,Integer.MAX_VALUE);while(!heap.isEmpty()){int[] info = heap.poll();int d = info[1];int node = info[0];if(dist[node]!=Integer.MAX_VALUE) continue;dist[node] = d;if(graph.containsKey(node)){for(int[] edge :graph.get(node)){if(dist[edge[0]]==Integer.MAX_VALUE){heap.offer(new int[]{edge[0],edge[1]+d});}}}}int max = 0;for(int i=1;i<=N;i++){if(dist[i] == Integer.MAX_VALUE) return -1;max = Math.max(max, dist[i]);}return max;}

思路3:也是Dijkstra’s算法。但是是用数组实现的。快很多,耗时13ms。代码
代码

417. Pacific Atlantic Water Flow

思路:这道题目不难。难的是理解题目含义。红色框的所有位置相当于都是Pacific的入口。能到达这些位置的点,都能流入Pacific。同理对于Atlantic也一样。标记哪些位置是能流入二者的点就是需要返回的点。
这里写图片描述
代码

207. Course Schedule

思路:检测有向图上是否有环。
思路1:BFS。1、构建图;2 找到入度为0的点,加入到队列;3 从队列中弹出一个元素,count+1,找到这个元素可以达到的点(课程),将这些课程的入度减1;4 如果发现有新的入度为0的点,继续加入到队列;5 重复步骤3,4直到队列为空;6 判断count是否等于课程数。如果等于返回true。
思路2:DFS。1、构建图;2 参考802. Find Eventual Safe States,我们设计节点的访问有三种状态,还没有开始访问节点是白(0),开始访问一个节点是灰(1),访问一个节点结束是黑(2);3 我们依次访问所有课程,如果节点状态是1,则表示有环,返回false;如果节点状态是2,则表示已经访问成功直接返回true;如果节点状态是0,则进入访问,状态修改为1;接着dfs访问这个节点的邻接节点。
代码

721. Accounts Merge

思路:这题目初看上去很简单。map吧。把email和用户名做映射。但实际上没这么简单。
学习:DFS。这是一个图。图的链接技巧是将第一个email和同一个list内的其他email双向相连。连通的email就是在同一个组内。
DFS思路代码 AccountsMergeV2
union-find代码思路 AccountsMergeV3 AccountsMergeV4
我自己写的union-find超时了。

542. 01 Matrix

思路:这道题目DFS思路可以解决。但有一个细节需要解决。如果matrix[i][j]=1,计算最近0距离的时候。1 先判断周围是否有0,如果有则距离为1,直接退出。2 不满足条件1,继续搜索周围相邻节点。这个过程中,没有把相邻节点的计算保留下来,所以会有重复计算.在整个dfs过程中并没有对r的有效修改,所以会有重复的。 例如,在计算(0,4)的最近0距离的时候,会计算(1,4)点的最近0距离,但是结果并没有保存下来。
这个问题的解决,在别人文章中学到了。在从左到右,从上到下的遍历中,dist[i][j] = Min(dist[i][j],min(dist[i-1][j]+1,dist[i][j-1]+1))。因为在这样的遍历中,(i-1,j)和(i,j-1)节点是计算过的。在从下到上,从右到左的遍历中,dist[i][j] = Min(dist[i][j],min(dist[i+1][j]+1,dist[i][j+1]+1))。因为在这样的遍历中,(i,j+1)和(i+1,j)节点是计算过的。
这是一种DP的思想。但是这样的思维,就确定整个计算过程不会出错。要不,我总会想,是应该先计算(1,4)还是先计算(0,4)。究竟是(0,4)点的距离影响(1,4)还是(1,4)点的距离影响(0,4)。而这种从上到下,从左到右遍历一次;从下到上,从右到左再遍历一次,就好多了。
学习:BFS思路,考虑从matrix[i][j]=0的点开始扩散查找,更有意思了。
代码

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

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

相关文章

java面试题6 牛客:哪个关键字可以对对象加互斥锁?

哪个关键字可以对对象加互斥锁&#xff1f;&#xff08;&#xff09; A synchronized B volatile C serialize D static synchronized的4种用法 1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进…

[Leetcode][第347题][JAVA][前K个高频元素][优先队列][堆][遍历set/map]

【问题描述】[中等] 【解答思路】 1. 堆 复杂度 class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer, Integer> occurrences new HashMap<Integer, Integer>();for (int num : nums) {occurrences.put(num, occurrences.getOrDefault…

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

576. Out of Boundary Paths 思路&#xff1a;这道题目难倒了我。最直接的思路是暴力搜索。要注意的问题1是需要仔细观察Example2&#xff0c;轨迹不同意思是可以从A点到B点&#xff0c;再从B点到A点也可以&#xff0c;只要step够用。所以暴力搜索&#xff0c;在(i,j)点在步骤…

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;采用的是共享内存模型来实现多线程之间的信息交换和数据同步的。 线程之间通过共享程序公共的状态&#…