DFS
软件园里卖煎饼
以文载意,以理铸心
展开
-
每日一题:873. 最长的斐波那契子序列的长度
深度优先搜索原创 2022-07-09 12:28:09 · 71 阅读 · 0 评论 -
每日一题:241. 为运算表达式设计优先级
分治,也可以理解为记忆化的dfs,难点在于思路保持清晰例如表达式2-1-1遇到第一个运算符-,开始递归分为左侧表达式2,右侧表达式1-1,符号为-左侧表达式2递归后,为纯数字,list为{2}右侧表达式1-1递归后,遇到运算符-,开始递归分为左侧表达式1,右侧表达式1,符号为-左侧表达式递归后为纯数字,list为{1}右侧表达式递归后为纯数字,list为{1}进行计算后结果为0,最终表达式1-1结果list为{0}{2}与{0}开始计算,运算符为-结果为2...原创 2022-07-01 10:56:34 · 86 阅读 · 0 评论 -
每日一题:1305. 两棵二叉搜索树中的所有元素
解题思路搜索树中序遍历即为升序排列,对两个根进行dfs在把序列组合代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int va原创 2022-05-01 18:47:10 · 406 阅读 · 0 评论 -
每日一题:427. 建立四叉树
解题思路实际上就是递归构建树,但是理解题意会比较困难,可以看一下题解,就会明白四叉树的定义当前区域内值均相同,那么就是一个非叶子节点,反之则需要再次进行划分,从正方形的中心点开始分割代码/*// Definition for a QuadTree node.class Node { public boolean val; public boolean isLeaf; public Node topLeft; public Node topRight; pu原创 2022-04-29 10:38:27 · 233 阅读 · 0 评论 -
每日一题:417. 太平洋大西洋水流问题
解题思路题目需要找到既能流入太平洋同时也能流向大西洋的区域初始想法是对每个区域进行dfs判断其能否到达两个大洋,但时间复杂度过高因此更换一种思路,沿着边界进行dfs找到有多少区域能够流到边界位置,且需要两种边界的访问图,Pacific以及Atlantic,最后进行遍历,如果两个访问图都为true的位置,便是答案,即可以流向两个大洋代码class Solution { List<List<Integer>> ans; int[][] dir = {{-1,0}原创 2022-04-27 11:53:41 · 98 阅读 · 0 评论 -
每日一题:1020. 飞地的数量
解题思路遍历周围一圈的1并将与之相连的1全部变为0,这样grid中剩下的1就是无法到达边界的代码class Solution { public int numEnclaves(int[][] grid) { int res = 0; for (int i=0;i<grid.length;i++){ for (int j=0;j<grid[0].length;j++){ if (grid[i][j原创 2022-02-12 13:58:49 · 158 阅读 · 0 评论 -
5947. 从给定原材料中找到所有可以做出的菜
解题思路DFS,并进行剪枝代码class Solution { public List<String> findAllRecipes(String[] recipes, List<List<String>> ingredients, String[] supplies) { List<String> res = new ArrayList<>(); Set<String> have原创 2021-12-27 13:16:07 · 146 阅读 · 0 评论 -
每日一题:419. 甲板上的战舰
解题思路类似于岛屿数量问题,只需要在图中找出练成一片的X即可代码class Solution { int[][] dir = {{-1,0},{1,0},{0,-1},{0,1}}; public int countBattleships(char[][] board) { int res = 0; for (int i=0;i<board.length;i++){ for (int j=0;j<board[i].le原创 2021-12-18 09:51:07 · 225 阅读 · 0 评论 -
第 263 场周赛 字节跳动T3.2044. 统计按位或能得到最大值的子集数目
解题思路先找到按位或可以的到的最大值再进行dfs深搜,分为选择当前数和不选择当前数代码class Solution { int count = 0,max = 0; public int countMaxOrSubsets(int[] nums) { for (int i : nums) { max |= i; } dfs(nums,0,0); return count; } pu原创 2021-12-16 13:57:26 · 526 阅读 · 0 评论 -
第 67 场双周赛T3.5936. 引爆最多的炸弹
解题思路首先找出当前炸弹能引爆的炸弹利用Map存储当前炸弹能引爆的炸弹编号(需要注意判断能否引爆的函数中要使用long类型,不然会产生溢出问题)根据Map集合,选择不同的炸弹作为起爆点,进行DFS或BFS找到最佳起爆点代码//DFS解法class Solution { public int maximumDetonation(int[][] bombs) { int ans = Integer.MIN_VALUE; //记录炸弹编号和其可以引爆的炸弹原创 2021-12-12 14:31:14 · 307 阅读 · 0 评论 -
第 264 场周赛Cider T3.2049. 统计最高分的节点数目
解题思路DFS代码class Solution { public int countHighestScoreNodes(int[] parents) { //得分为子树的大小 //实际上就是删除一个节点将其刨除,然后看其他剩余子树的大小相乘即可 Map<Integer, List<Integer>> map = new HashMap(); int[] count = new int[parents.len原创 2021-12-11 10:34:27 · 108 阅读 · 0 评论 -
每日一题:794. 有效的井字游戏
解题思路DFS+回溯,主要是要考虑各种情况代码class Point{ int x; int y; Point(int n,int m){ this.x = n; this.y = m; }}class Solution { boolean Flag = false; public boolean validTicTacToe(String[] board) { char[][] chessBoard原创 2021-12-09 12:39:14 · 165 阅读 · 0 评论 -
面试题 04.06. 后继者
解题思路对二叉搜索树进行中序遍历得到的中序遍历后的集合,然后去吃目标P的之后一个即可代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { List<TreeN原创 2021-12-08 11:38:20 · 155 阅读 · 0 评论 -
第270场周赛灵动科技.T1找出 3 位偶数
解题思路DFS即可,每次使用其中的一个数字,进行组合,在DFS函数中进行剪枝,例如第一个数字不可以用0,第二个数字可以随意取值,第三个数字不能取奇数,因为要保证是三位偶数代码class Solution { public int[][] colorBorder(int[][] grid, int row, int col, int color) { int m = grid.length, n = grid[0].length; boolean[][] visi原创 2021-12-07 15:00:23 · 62 阅读 · 0 评论 -
每日一题:700. 二叉搜索树中的搜索
解题思路两种思路BFS和DFS,因为是二叉搜索树,所以可以想到DFS加入条件判断肯定比BFS快代码//DFSclass Solution { public TreeNode searchBST(TreeNode root, int val) { return dfs(root,val); } public TreeNode dfs(TreeNode root,int val) { if (root.val == val) {原创 2021-11-26 10:43:52 · 264 阅读 · 1 评论 -
每日一题:563. 二叉树的坡度
解题思路深度优先搜索即可代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tre原创 2021-11-18 09:42:44 · 48 阅读 · 1 评论 -
每日一题:375. 猜数字大小 II
解题思路记忆化搜素,最难的是理解题目代码class Solution { int N = 210; int[][] cache = new int[N][N]; public int getMoneyAmount(int n) { return dfs(1, n); } int dfs(int l, int r) { if (l >= r) return 0; if (cache[l][r] != 0) re原创 2021-11-12 10:02:23 · 189 阅读 · 0 评论 -
每日一题:869. 重新排序得到 2 的幂
解题思路暴力搜索代码class Solution { boolean flag = false; public boolean reorderedPowerOf2(int n) { if (n==1){ return true; } String string = Integer.toString(n); char[] chars = string.toCharArray(); bo原创 2021-10-28 10:31:35 · 62 阅读 · 0 评论 -
每日一题:301. 删除无效的括号
解题思路前置的题目有 22题以及20题第一点.求出要删除的左括号数和右括号数第二点.对当前位置的符号进行判断,如果是字符那么必定需要加入如果是左括号,那么可以选择不要,如果不要,那么左括号剩余可删除数需要-1,也可以选择需要如果是右括号,那么可以选择不要,如果不要,那么右括号剩余可删除数需要-1,选择要右括号的情况必须是左括号数量大于右括号代码class Solution { /* 求出到底最少需要删除多少个括号? 搜索的时候如何剪枝,如何保证最后搜出来的是合法的结果。原创 2021-10-27 14:11:35 · 66 阅读 · 0 评论 -
每日一题:22. 括号生成
解题思路DFS深度优先搜索,每个位置上都可以为’(‘或’)'可以肯定的一点是在满足合法括号的情况下左括号数量一定是等于右括号数量的且右括号数量一定小于左括号代码class Solution { List<String> ans; public List<String> generateParenthesis(int n) { ans = new ArrayList<>(); dfs(new StringBuilder原创 2021-10-27 12:58:16 · 59 阅读 · 0 评论 -
每日一题.797. 所有可能的路径
解题思路此处撰写解题思路代码class Solution { List<List<Integer>> ans; public List<List<Integer>> allPathsSourceTarget(int[][] graph) { LinkedList<Integer> queue = new LinkedList<>(); ans = new ArrayList<&原创 2021-09-03 23:56:37 · 52 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
解题思路dfs代码class Solution { int res = 0; void dfs(String str, int n) { if (n >= str.length() - 1) { res++; return; } dfs(str, n + 1);//不与后一位组合 if (str.charAt(n) - '0' > 0 &&am原创 2021-07-01 14:50:19 · 47 阅读 · 0 评论 -
每日一题:LCP 07. 传递信息(DFS)
解题思路DFS1.构造图,n*n的矩阵,连通则为12.dfs递归,记录步数还有当前所在位置,再利用当前位置的下标取出road中的数组,如果值为1就代表是连通的3.如果步数达到要求,且所在位置为n-1则ans++代码class Solution { int ans = 0; public int numWays(int n, int[][] relation, int k) { int[][] road = new int[n][n]; for(in原创 2021-07-01 10:28:13 · 61 阅读 · 0 评论 -
每日一题:518. 零钱兑换 II
解题思路记忆化搜索代码class Solution { Set<String> set = new HashSet<String>(); int[][] memo; public int change(int amount, int[] coins) { memo = new int[coins.length][amount+1];//记忆数组 Arrays.sort(coins); return back原创 2021-06-28 15:46:45 · 92 阅读 · 0 评论 -
每日一题:279. 完全平方数
解题思路DFS超时,最终使用BFS代码class Solution { public int numSquares(int n) { int step=0; boolean[] flag = new boolean[n]; LinkedList<Integer> queue = new LinkedList<>(); queue.add(n); while (!queue.isEmpty()原创 2021-06-16 14:50:42 · 66 阅读 · 1 评论 -
每日一题:877. 石子游戏
解题思路因为Alex先手,且石子为奇数个,所以肯定有Alex赢的方式,所以返回True即可代码class Solution { //直接方法 public boolean stoneGame(int[] piles) { return true; }}class Solution { boolean flag = false; Set<String> set; public boolean stoneGame(int[]原创 2021-06-16 14:42:55 · 43 阅读 · 0 评论 -
每日一题:494. 目标和
解题思路很简单的递归,对于每个地方的数无非就是两种情况,+或-,找到每个数的情况代码class Solution { int ans = 0; public int findTargetSumWays(int[] nums, int target) { backtrack(0,nums,target,0); return ans; } public void backtrack(int index,int[] nums, int targ原创 2021-06-09 08:33:40 · 51 阅读 · 3 评论 -
每日一题:403. 青蛙过河
解题思路基本的dfs加上标记操作,因为不需要考虑回溯的情况,所以将每一种跳跃方式都要找出来但是有一点需要注意的地方,不能在同一个地方,有同一种跳跃状态,比如到下标为5的地方,不能两次到这个地方,但是下次跳跃的距离都是2,这样就进行了重复计算,就没有意义了代码class Solution { boolean[] visited ; Map<Integer,Integer> map; Set<String> set; public boolean原创 2021-04-29 11:24:09 · 81 阅读 · 0 评论 -
每日一题:938. 二叉搜索树的范围和
解题思路最初的办法是dfs将所有符合要求的值加起来,这样相当于做了很多没有必要的递归所以改良后,使用到了二叉搜索树的特性,如果小于low则搜索右边,大于high则搜索左边,直接0ms代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * T原创 2021-04-27 12:29:01 · 45 阅读 · 0 评论 -
每日任务:回溯.216. 组合总和 III
解题思路dfs加回溯,对着案例看代码代码class Solution { List<List<Integer>> ans; int[] num = {1,2,3,4,5,6,7,8,9};//数字只能从这里面来 public List<List<Integer>> combinationSum3(int k, int n) { ans = new ArrayList<>(); boole原创 2021-04-25 22:23:09 · 56 阅读 · 0 评论 -
每日任务:回溯.40. 组合总和 II
解题思路dfs加回溯,结合案例看代码就能明白,我不好讲代码class Solution { List<List<Integer>> ans; public List<List<Integer>> combinationSum2(int[] candidates, int target) { ans = new ArrayList<>(); LinkedList<Integer> te原创 2021-04-25 22:19:07 · 47 阅读 · 0 评论 -
每日任务:回溯.39. 组合总和
解题思路dfs加回溯,思路不好讲出来,可以结合案例看代码代码class Solution { List<List<Integer>> ans; public List<List<Integer>> combinationSum(int[] candidates, int target) { ans = new ArrayList<>(); LinkedList<Integer> te原创 2021-04-25 22:14:48 · 42 阅读 · 0 评论 -
每日任务:回溯.47. 全排列 II
解题思路bfs加回溯,需要判断是否有重复代码class Solution { List<List<Integer>> ans; public List<List<Integer>> permuteUnique(int[] nums) { ans = new ArrayList<>(); boolean[] visited = new boolean[nums.length]; L原创 2021-04-25 22:11:15 · 38 阅读 · 0 评论 -
每日任务:回溯.78. 子集
解题思路dfs回溯,easy~代码class Solution { List<List<Integer>> ans; public List<List<Integer>> subsets(int[] nums) { ans = new ArrayList<>(); LinkedList<Integer> tem = new LinkedList<>();原创 2021-04-25 22:07:45 · 44 阅读 · 0 评论 -
每日任务:回溯.77. 组合
解题思路从1开始不断增大,并进行组合代码class Solution { List<List<Integer>> ans; public List<List<Integer>> combine(int n, int k) { ans = new ArrayList<>(); LinkedList<Integer> tem = new LinkedList<>();原创 2021-04-25 22:04:49 · 43 阅读 · 0 评论 -
每日任务:二叉树.508. 出现次数最多的子树元素和
解题思路不知道为什么过不了最后一个案例,很奇怪代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ 过不了最后一个案例class Solution { List<Integer> l原创 2021-04-20 15:00:08 · 80 阅读 · 0 评论 -
每日任务:二叉树.226. 翻转二叉树
解题思路简单的递归代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNo原创 2021-04-19 21:19:15 · 39 阅读 · 0 评论 -
每日任务:二叉树.404. 左叶子之和
解题思路简单的递归代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNo原创 2021-04-19 21:16:59 · 42 阅读 · 0 评论 -
每日任务:二叉树.114. 二叉树展开为链表
解题思路很简单的递归代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeN原创 2021-04-19 21:16:10 · 61 阅读 · 0 评论 -
每日任务:二叉树.100. 相同的树
解题思路递归~代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode原创 2021-04-19 19:21:44 · 48 阅读 · 0 评论