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

104. Maximum Depth of Binary Tree

思路:顺着树的一个分支一直数层数直到叶子节点。DFS的思路。这个题目可以练习的是递归转迭代。
代码

695. Max Area of Island

思路:遇到点i,j;如果grid[i][j]没有被访问过,并且等于1,那么就数数i,j的4个方向上,能有多少个1。先数某一个方向,直到不能数下去;再换一个方向。
这道题目可以练习的是:判断是否访问过,可以开辟一个boolean数组;或者将访问过的grid[i][j] = 0;还可以练习递归转迭代。
代码

690. Employee Importance

思路:这个题目也没什么好说的。深度优先搜索=暴力搜索吧。学习递归改迭代。
代码

110. Balanced Binary Tree

思路:要检查每个节点的左右子树的高度。看高度相差是否大于1。一边计算树的高度,一边判断是否平衡,想了好久,代码没写出来。
代码

111. Minimum Depth of Binary Tree

思路:与112. Path Sum 一样,要注意条件是到叶子节点。
代码

513. Find Bottom Left Tree Value

思路:题目理解错误 find the leftmost value in the last row of the tree。找到树的最后一行最左边的值;我找到的是左子树深度最深的值。从左节点开始遍历。遇到深度更深的节点替换原来记录的leftVal。
学习:也可以用BFS 广度优先搜索来做。只是记住先遍历右子树。

513. Find Bottom Left Tree Value

思路:要在树的每一层找到最大值。可以用DFS或者BFS。BFS是优先考虑到的。要用DFS,就需要在遍历的时候记录当前访问的深度。同深度的数值最比较。需要找到每层数值的特征,肯定用BFS可以解决。
代码

529. Minesweeper

思路:题目不难,DFS。问题是写对dx和dy。
代码

547. Friend Circles

思路:DFS应用了一些业务逻辑,没有顺利完成。访问到一个点i,j等于1,接着检查位置(i,j+1),(i,j+2)….(j,0),(j,1)…(j,n),然后继续扩展。和Minesweeper挺像的。只是这种逻辑需要自己总结。
学习:还可以用并查集find-union的思路来解决。
代码

756. Pyramid Transition Matrix

思路:DFS。首先根据allowed构建前缀map。其次,根据bottom初始化pyramid底层。最后用dfs构建金字塔的每一层。例如bottom=”XXYX”,构建长度为3的层,长度为2的层,长度为1的层。思路虽简单,写代码的时候,要考虑当长度为len的构建完成,怎么转下一层。
学习:记录当前选择的字符有几种处理方式:可以用字符串保存,可以用一个list保存,也可以保存到二进制中。用二进制更快。二进制版本的详细解决看代码。
代码

337. House Robber III

思路:这道题目是一道典型的从暴力搜索向动态规划迈进的题目。
先说暴力搜索(其实就是DFS)。对于TreeNode node来讲。可以抢劫node,也可以不抢劫。最后返回数值大的。

    public int rob(TreeNode root) {return dfs(root, true);}private int dfs(TreeNode node, boolean robAble) {if (node == null) {return 0;}if (node.left == null && node.right == null) {return robAble ? node.val : 0;}// 不抢nodeint val = dfs(node.left, true) + dfs(node.right, true);// 抢劫nodeif (robAble) {val = Math.max(val, node.val + dfs(node.left, false) + dfs(node.right, false));}return val;}

进一步优化:这里有重复解决的子问题。在解决node1的时候,需要解决:抢劫node2,抢劫node3,不抢劫node2,不抢劫node3;在解决抢劫node2需要解决抢和不抢两个问题,而不抢劫node2的问题中也要解决不抢的问题。所以这里是有重复子问题的。我们这里有两种解决方法。一种是消除重复子问题,一种是把子问题的状态保存起来,只算一次。
这里写图片描述

状态保存,只算一次

    public int robV5(TreeNode root) {return dfsV5(root, true,new HashMap<TreeNode,Integer>(),new HashMap<TreeNode,Integer>());}private int dfsV5(TreeNode node, boolean robAble,Map<TreeNode,Integer> canMap,Map<TreeNode,Integer> notMap) {if (node == null) {return 0;}if(robAble && canMap.get(node)!=null) return canMap.get(node);if(!robAble && notMap.get(node)!=null) return notMap.get(node);// 不抢nodeint val = dfsV5(node.left, true,canMap,notMap) + dfsV5(node.right, true,canMap,notMap);notMap.put(node, val);// 抢劫nodeif (robAble) {val = Math.max(val, node.val + dfsV5(node.left, false,canMap,notMap) + dfsV5(node.right, false,canMap,notMap));canMap.put(node, val);}return val;}

消除重复子问题

利用动态规划的思想,算出对于每个节点node ,抢和不抢两种情况下的最大值。最后返回root节点抢和不抢收益的最大值。对于树的动态规划与数组动态规划解决起来有点区别。leetcode上有一道题目是买卖股票的题目。每天可以买股票也可以卖股票。解决方法之一就是要保存每天持有股票、卖出股票的状态。

    public int robV4(TreeNode root) {int[] res = robNode(root);return Math.max(res[0], res[1]);}/*** res[0]=不抢劫root的最大收益* res[1]=抢劫root的最大收益* @param root* @return*/private int[] robNode(TreeNode root) {if (root == null)return new int[2];int[] left = robNode(root.left);int[] right = robNode(root.right);return new int[] { Math.max(left[0], left[1]) + Math.max(right[0],right[1]), root.val + left[0] + right[0] };}

代码

494. Target Sum

思路:题目不难。再次是一个典型的DFS到DP。先暴力搜索得到一个思路。对于每个nums[i],给予 +或者-,计算可能性。
接着考虑dp,找到初始条件和递归方程。在nums[i]想要得到S,那么就是 nums[i]-1 的时候得到 S-nums[i] 的方法数+ 得到S+nums[i]的方法数。初始条件是 得到nums[0] 的方法数是1 ,得到-nums[0]的方法数是1。
写递归版的DP;加上缓存的DP;把递归改为迭代的DP;优化缓存的DP。我依然停在了递归改迭代。看来进入DP专题的时候,这块我要多多练习。
代码

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

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

相关文章

作用域和数组

作用域 就是一对大括号{} 作用域的的特点在作用域内部声明的变量,只能在这个作用域使用 数组 array 一组类型相同的数(值)1.数组一旦定义好长度就不能改变了2.数组访问摸个数据的方式 数组以下标(index)的方式获取数据 数组的声明 定义10个学员的成绩/两只之间以,隔开…

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

199. Binary Tree Right Side View 思路&#xff1a;想要得到树的每一层最右侧元素值&#xff0c;用BFS最方便。先访问左节点再访问右节点&#xff0c;最后访问的一个值就是留下的值。 想要DFS的思路也可以。只是一定要访问所有节点。 代码 491 Increasing Subsequences …

[Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]

【问题描述】[中等] 【解答思路】 1. 回溯搜索算法 剪枝 &#xff0c;直接来到叶子结点 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(N) import java.util.Arrays;public class Solution {/*** 记录数字是否使用过*/private boolean[] used;/*** 阶乘数组*/priv…

机器学习中的数学--数学知识复习

机器学习 机器学习三个部分&#xff1a;编程能力数学统计知识业务知识 机器学习分类 1 监督学习&#xff1a;例如分类、房价预测 2 无监督学习&#xff1a;例如聚类 3 强化学习&#xff1a;例如动态系统、机器人控制系统 机器学习算法 是否连续无监督有监督连续聚类 &am…

【数据结构与算法】【算法思想】拓扑排序

一、拓扑排序 拓扑排序是基于依赖关系的节点&#xff0c;根据依赖关系而生成的序列。节点和依赖关系往往要生成有向无环图。类似的问题有&#xff1a;穿衣服裤子的先后关系&#xff0c;生成穿衣序列/专业课程与前置课程形成的课程学习序列/代码编译依赖关系形成的编译顺序序列…

java面试题5 牛客:下列关于JavaBean的说法正确的是:

下列关于JavaBean的说法正确的是&#xff1a; A:Java文件与Bean所定义的类名可以不同&#xff0c;但一定要注意区分字母的大小写 B:在JSP文件中引用Bean&#xff0c;其实就是用语句 C&#xff1a;被引用的Bean文件的文件名后缀为.java D:Bean文件放在任何目录下都可以被引用…

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

473. Matchsticks to Square 思路&#xff1a;有n根长度不一的火柴&#xff0c;这些火柴可以拼接在一起&#xff0c;但不能被折断。这些火柴能够围城一个正方形吗&#xff1f;每个火柴可以并且必须使用一次。分析得到每个边的长度应该是所有火柴长度和的1/4。接下来就是将火柴…

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)…