给定一个二叉树的根节点 root
,和一个整数 targetSum
,求该二叉树里节点值之和等于 targetSum
的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例 1:
输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8 输出:3 解释:和等于 8 的路径有 3 条,如图所示。
示例 2:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:3
class Solution {Map<Long , Integer> prefixMap;int target;public int pathSum(TreeNode root, int sum) {prefixMap = new HashMap<>();target = sum;prefixMap.put(0L, 1);return recur(root, 0L);}private int recur(TreeNode node, Long curSum) {if(node == null) {return 0;}int res = 0;curSum += node.val;res += prefixMap.getOrDefault(curSum - target, 0);prefixMap.put(curSum, prefixMap.getOrDefault(curSum, 0) + 1);int left = recur(node.left, curSum);int right = recur(node.right, curSum);res = res + left + right;prefixMap.put(curSum, prefixMap.get(curSum) - 1);return res;}
}
利用了前缀和的思想,利用hashmap将所有前缀和记录下来,key为前缀和,value为次数。遍历树中的每一个节点,查找hashmap中是否存在(现在的前缀和-target)的值,若存在则说明在二叉树中存在一条路径,是的它们之间的差值为target。需要注意的是,这道题的node.val 在10^9范围内,且node数在1000范围内,因此前缀和可能会超过int型范围,因此要用long来存储前缀和。且由于一个节点必须是另一个节点的祖先节点的前途条件,因此每次处理完一个节点后,要做状态恢复,即在遍历完一个节点的所有子节点后,将其从map中除去。
LC207.课程表
你这个学期必须选修 numCourses
门课程,记为 0
到 numCourses - 1
。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites
给出,其中 prerequisites[i] = [ai, bi]
,表示如果要学习课程 ai
则 必须 先学习课程 bi
。
- 例如,先修课程对
[0, 1]
表示:想要学习课程0
,你需要先完成课程1
。
请你判断是否可能完成所有课程的学习?如果可以,返回 true
;否则,返回 false
。
示例 1:
输入:numCourses = 2, prerequisites = [[1,0]] 输出:true 解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
示例 2:
输入:numCourses = 2, prerequisites = [[1,0],[0,1]] 输出:false 解释:总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。
class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<List<Integer>> adjacency = new ArrayList<>();for(int i = 0; i < numCourses; i++)adjacency.add(new ArrayList<>());int[] flags = new int[numCourses];for(int[] cp : prerequisites)adjacency.get(cp[1]).add(cp[0]);for(int i = 0; i < numCourses; i++)if(!dfs(adjacency, flags, i)) return false;return true;}private boolean dfs(List<List<Integer>> adjacency, int[] flags, int i) {if(flags[i] == 1) return false;if(flags[i] == -1) return true;flags[i] = 1;for(Integer j : adjacency.get(i))if(!dfs(adjacency, flags, j)) return false;flags[i] = -1;return true;}}
这个解析比较好理解https://leetcode.cn/problems/course-schedule/solutions/18806/course-schedule-tuo-bu-pai-xu-bfsdfsliang-chong-fa/comments/759679https://leetcode.cn/problems/course-schedule/solutions/18806/course-schedule-tuo-bu-pai-xu-bfsdfsliang-chong-fa/comments/759679