当前位置: 首页 > news >正文

JAVA刷题记录: 递归,搜索与回溯

专题一 递归

面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)

class Solution {public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {dfs(A, B, C, A.size());}public void dfs(List<Integer> a, List<Integer> b, List<Integer> c, int num) {if(num == 1) {c.add(a.remove(a.size() - 1));return;}dfs(a, c, b, num - 1);c.add(a.remove(a.size() - 1));dfs(b, a, c, num - 1);return;}
}

21. 合并两个有序链表 - 力扣(LeetCode)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if(list1 == null) return list2;if(list2 == null) return list1;if(list1.val <= list2.val) {list1.next = mergeTwoLists(list1.next, list2); return list1;}else {list2.next = mergeTwoLists(list1, list2.next); return list2;}}
}

206. 反转链表 - 力扣(LeetCode)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {if(head == null || head.next == null) return head;ListNode newHead = reverseList(head.next);head.next.next = head;head.next = null;return newHead;}
}

24. 两两交换链表中的节点 - 力扣(LeetCode)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {if(head == null || head.next == null) return head;ListNode tmp = swapPairs(head.next.next);ListNode ret = head.next;head.next = tmp;ret.next = head;return ret;}
}

专题二 二叉树中的深搜

/*** 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 right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean evaluateTree(TreeNode root) {if(root.left == null) return root.val == 0 ? false : true;boolean left = evaluateTree(root.left);boolean right = evaluateTree(root.right);return root.val == 2 ? left | right : left & right;}
}

129. 求根节点到叶节点数字之和 - 力扣(LeetCode)

/*** 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 right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int sumNumbers(TreeNode root) {return sum(root, 0);}public int sum(TreeNode root, int pre) {pre = pre * 10 + root.val;if(root.left == null && root.right == null) return pre; int ret = 0;if(root.left != null) ret += sum(root.left, pre);if(root.right != null) ret += sum(root.right, pre);return ret; }
}

814. 二叉树剪枝 - 力扣(LeetCode)

/*** 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 right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode pruneTree(TreeNode root) {if(root == null) return null;root.left = pruneTree(root.left);root.right = pruneTree(root.right);if(root.left == null && root.right == null && root.val == 0) root = null;return root;}
}

98. 验证二叉搜索树 - 力扣(LeetCode)

/*** 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 right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {long pre = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if(root == null)  return true;boolean left = isValidBST(root.left);if(left == false) return false;boolean cur = false;if(pre < root.val) cur = true;if(cur == false) return false;pre = root.val;boolean right = isValidBST(root.right);return right;}
}

230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode)

/*** 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 right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {int count;int ret;public int kthSmallest(TreeNode root, int k) {count = k; ret = 0;dfs(root);return ret;}public void dfs(TreeNode root) {if(root == null || count == 0) return ;dfs(root.left);count--;if(count == 0) {ret = root.val;return;}dfs(root.right);}
}

257. 二叉树的所有路径 - 力扣(LeetCode)

/*** 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 right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {List<String> ret;public List<String> binaryTreePaths(TreeNode root) {ret = new ArrayList<>();dfs(root, new StringBuffer());return ret;}public void dfs(TreeNode root, StringBuffer _path) {StringBuffer path = new StringBuffer(_path);path.append(Integer.toString(root.val));if(root.left == null && root.right == null) {ret.add(path.toString());return;}path.append("->");if(root.left != null) dfs(root.left, path);if(root.right != null) dfs(root.right, path);}
}

专题三 dfs

46. 全排列 - 力扣(LeetCode)

class Solution {List<List<Integer>> ret;List<Integer> path;boolean[] check;public List<List<Integer>> permute(int[] nums) {ret = new ArrayList<>();path = new ArrayList<>();check = new boolean[nums.length];dfs(nums);return ret;}public void dfs(int[] nums) {if(path.size() == nums.length) {ret.add(new ArrayList(path)); return ;}for(int i = 0; i < nums.length; i++) {if(check[i] == false) {check[i] = true;path.add(nums[i]);dfs(nums);check[i] = false;path.remove(path.size() - 1);}}}
}

78. 子集 - 力扣(LeetCode)

class Solution {List<List<Integer>> ret;List<Integer> path;public List<List<Integer>> subsets(int[] nums) {path = new ArrayList<>();ret = new ArrayList<>();dfs(nums, 0);return ret;}public void dfs(int[] nums, int i) {if(i == nums.length) {ret.add(new ArrayList(path));return ;}path.add(nums[i]);dfs(nums, i + 1);path.remove(path.size() - 1);dfs(nums, i + 1);}
}
class Solution {List<List<Integer>> ret;List<Integer> path;public List<List<Integer>> subsets(int[] nums) {path = new ArrayList<>();ret = new ArrayList<>();dfs(nums, 0);return ret;}public void dfs(int[] nums, int pos) {ret.add(new ArrayList(path));for(int i = pos; i < nums.length; i++) {path.add(nums[i]);dfs(nums, i + 1);path.remove(path.size() - 1);}}
}

专题四 综合练习

1863. 找出所有子集的异或总和再求和 - 力扣(LeetCode)

class Solution {int sum = 0;int path = 0;public int subsetXORSum(int[] nums) {dfs(nums, 0);return sum;}public void dfs(int[] nums, int pos) {sum += path;for(int i = pos; i < nums.length; i++) {path ^= nums[i];dfs(nums, i + 1);path ^= nums[i];}}
}

47. 全排列 II - 力扣(LeetCode)

class Solution {List<List<Integer>> ret;List<Integer> path;boolean[] check;public List<List<Integer>> permuteUnique(int[] nums) {ret = new ArrayList<>();path = new ArrayList<>();check = new boolean[nums.length];Arrays.sort(nums);dfs(nums, 0);return ret;}public void dfs(int[] nums, int pos) {if(pos == nums.length){ ret.add(new ArrayList(path)); return;}for(int i = 0; i < nums.length; i++) {if(check[i] == true || (i != 0 && nums[i] == nums[i - 1] && check[i - 1] == false)) {continue;}check[i] = true;path.add(nums[i]);dfs(nums, pos + 1);check[i] = false;path.remove(path.size() - 1);}return;}
}

17. 电话号码的字母组合 - 力扣(LeetCode)

class Solution {String[] hash = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxzy"};List<String> ret;StringBuffer path;public List<String> letterCombinations(String digits) {path = new StringBuffer();ret = new ArrayList<>();if(digits.length() == 0) return ret;dfs(digits, 0);return ret;}public void dfs(String digits, int pos) {if(pos == digits.length()) {ret.add(path.toString());return;}String cur = hash[digits.charAt(pos) - '0'];for(int i = 0; i < cur.length(); i++) {path.append(cur.charAt(i));dfs(digits, pos + 1);path.deleteCharAt(path.length() - 1);}}
}

22. 括号生成 - 力扣(LeetCode)

class Solution {int left, right, n;List<String> ret;StringBuffer path;public List<String> generateParenthesis(int _n) {left = right = 0;n = _n;ret = new ArrayList<>();path = new StringBuffer();dfs();return ret;}public void dfs() {if(right == n) {ret.add(path.toString());}if(left < n) {left++;path.append('(');dfs();left--;path.deleteCharAt(path.length() - 1);}if(right < left) {right++;path.append(')');dfs();right--;path.deleteCharAt(path.length() - 1);}}
}

77. 组合 - 力扣(LeetCode)

class Solution {int n, k;List<List<Integer>> ret;List<Integer> path;public List<List<Integer>> combine(int _n, int _k) {n = _n; k = _k;ret = new ArrayList<>();path = new ArrayList<>();dfs(1);return ret;}public void dfs(int start) {if(path.size() == k) {ret.add(new ArrayList<>(path));return;}for(int i = start; i <= n; i++) {path.add(i);dfs(i + 1);path.remove(path.size() - 1);}}
}

494. 目标和 - 力扣(LeetCode)

class Solution {int ret, aim;public int findTargetSumWays(int[] nums, int target) {aim = target;ret = 0;dfs(nums, 0, 0);return ret;}public void dfs(int[] nums, int pos, int path) {if(pos == nums.length) {if(path == aim) ret++;return;}dfs(nums, pos + 1, path + nums[pos]);dfs(nums, pos + 1, path - nums[pos]);}
}

39. 组合总和 - 力扣(LeetCode)

class Solution {int aim;List<List<Integer>> ret;List<Integer> path;public List<List<Integer>> combinationSum(int[] candidates, int target) {aim = target;ret = new ArrayList<>();path = new ArrayList<>();dfs(candidates, 0, 0);return ret;}public void dfs(int[] nums, int pos, int sum) {if(sum == aim) {ret.add(new ArrayList(path));return;}if(sum > aim || pos == nums.length) return;for(int i = pos; i < nums.length; i++) {path.add(nums[i]);dfs(nums, i, sum + nums[i]);path.remove(path.size() - 1); }}
}

39. 组合总和 - 力扣(LeetCode)

class Solution {int aim;List<List<Integer>> ret;List<Integer> path;public List<List<Integer>> combinationSum(int[] candidates, int target) {aim = target;ret = new ArrayList<>();path = new ArrayList<>();dfs(candidates, 0, 0);return ret;}public void dfs(int[] nums, int pos, int sum) {if(sum == aim) {ret.add(new ArrayList(path));return;}if(sum > aim || pos == nums.length) return;for(int i = pos; i < nums.length; i++) {path.add(nums[i]);dfs(nums, i, sum + nums[i]);path.remove(path.size() - 1); }}
}

784. 字母大小写全排列 - 力扣(LeetCode)

class Solution {StringBuffer path;List<String> ret;public List<String> letterCasePermutation(String s) {path = new StringBuffer();ret = new ArrayList<>();dfs(s, 0);return ret;}public char change(char ch) {if(ch >= 'a' && ch <= 'z') return ch -= 32;else return ch += 32;}public void dfs(String s, int pos) {if(pos == s.length()) {ret.add(path.toString());return;}path.append(s.charAt(pos));dfs(s, pos + 1);path.deleteCharAt(path.length() - 1);if(s.charAt(pos) < '0' || s.charAt(pos) > '9'){path.append(change(s.charAt(pos)));dfs(s, pos + 1);path.deleteCharAt(path.length() - 1);}}
}

51. N 皇后 - 力扣(LeetCode)

class Solution {List<List<String>> ret;char[][] path;boolean[] checkCol, checkDig1, checkDig2;int n;public List<List<String>> solveNQueens(int _n) {n = _n;path = new char[n][n];ret = new ArrayList<>();checkCol = new boolean[n];checkDig1 = new boolean[2 * n];checkDig2 = new boolean[2 * n];for(int i = 0; i < n; i++) {Arrays.fill(path[i], '.');}dfs(0);return ret;}public void dfs(int row) {if(row == n) {List<String> tmp = new ArrayList<>();for(int i = 0; i < n; i++) {tmp.add(new String(path[i]));}ret.add(tmp);}for(int col = 0; col < n; col++) {if(checkCol[col] == false && checkDig1[row - col + n] == false && checkDig2[row + col] == false){path[row][col] = 'Q';checkCol[col] = checkDig1[row - col + n] = checkDig2[row + col] = true;dfs(row + 1);checkCol[col] = checkDig1[row - col + n] = checkDig2[row + col] = false;path[row][col] = '.';}}}
}

36. 有效的数独 - 力扣(LeetCode)

class Solution {boolean[][] row, col;boolean[][][] grid;public boolean isValidSudoku(char[][] board) {col = new boolean[9][10];row = new boolean[9][10];grid = new boolean[3][3][10];for(int i = 0; i < 9; i++) {for(int j = 0; j < 9; j++) {if(board[i][j] != '.'){int num = board[i][j] - '0';if(row[i][num] || col[j][num] || grid[i / 3][j / 3][num]){return false;}row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = true;}}}return true;}
}

37. 解数独 - 力扣(LeetCode)

class Solution {boolean[][] row, col;boolean[][][] grid;public void solveSudoku(char[][] board) {col = new boolean[9][10];row = new boolean[9][10];grid = new boolean[3][3][10];for(int i = 0; i < 9; i++) {for(int j = 0; j < 9; j++) {if(board[i][j] != '.'){int num = board[i][j] - '0';row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = true;}}}dfs(board);}public boolean dfs(char[][] board) {for(int i = 0; i < 9; i++) {for(int j = 0; j < 9; j++) {if(board[i][j] == '.') {for(int num = 1; num < 10; num++) {if(!row[i][num] && !col[j][num] && !grid[i / 3][j / 3][num]) {board[i][j] = (char)(num + '0');row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = true;if(dfs(board) == true) return true;board[i][j] = '.';row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = false;}}return false;}}}return true;}
}

79. 单词搜索 - 力扣(LeetCode)

class Solution {int m, n;char[] word;boolean[][] vis;public boolean exist(char[][] board, String _word) {m = board.length;n = board[0].length;vis = new boolean[m][n];word = _word.toCharArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (board[i][j] == word[0]) {vis[i][j] = true;if (dfs(board, i, j, 1))return true;vis[i][j] = false;}}}return false;}int[] dx = { 0, 0, 1, -1 };int[] dy = { 1, -1, 0, 0 };public boolean dfs(char[][] board, int i, int j, int pos) {if (pos == word.length) {return true;}for (int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k];if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && board[x][y] == word[pos]) {vis[x][y] = true;if (dfs(board, x, y, pos + 1))return true;vis[x][y] = false;}}return false;}
}

1219. 黄金矿工 - 力扣(LeetCode)

class Solution {int ret, n, m;boolean[][] vis;int[] dx = {0, 0, -1, 1};int[] dy = {-1, 1, 0, 0};public int getMaximumGold(int[][] grid) {m = grid.length; n = grid[0].length;vis = new boolean[m][n];for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {if(grid[i][j] != 0) {vis[i][j] = true;dfs(grid, i, j, grid[i][j]);vis[i][j] = false;}}}return ret;}public void dfs(int[][] grid, int i, int j, int path) {ret = Math.max(ret, path);for(int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] != 0) {vis[x][y] = true;dfs(grid, x, y, path + grid[x][y]);vis[x][y] = false;}}}
}

980. 不同路径 III - 力扣(LeetCode)

class Solution {int m, n, step, ret;boolean[][] vis;int[] dx = {0, 0, -1, 1};int[] dy = {-1, 1, 0, 0};public int uniquePathsIII(int[][] grid) {m = grid.length; n = grid[0].length;int bx = 0, by = 0;vis = new boolean[m][n];for(int i = 0; i < m; i++) {for(int j = 0;j < n; j++) {if(grid[i][j] == 0) step++;else if(grid[i][j] == 1) {bx = i; by = j;}else if(grid[i][j] == -1) vis[i][j] = true;}}step += 2;vis[bx][by] = true;dfs(grid, bx, by, 1);return ret;}public void dfs(int[][] grid, int i, int j, int count) {if(grid[i][j] == 2) {if(count == step) {ret++;}return;}for(int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y]) {vis[x][y] = true;dfs(grid, x, y, count + 1);vis[x][y] = false;}}}
}

专题五 floodfill算法

733. 图像渲染 - 力扣(LeetCode)

class Solution {int[] dx = {0, 0, -1, 1};int[] dy = {-1, 1, 0, 0};int prev, m, n;public int[][] floodFill(int[][] image, int sr, int sc, int color) {if(image[sr][sc] == color) return image;prev = image[sr][sc];m = image.length;n = image[0].length;dfs(image, sr, sc, color);return image;     }public void dfs(int[][] image, int i, int j, int color) {image[i][j] = color;for(int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && image[x][y] == prev) {dfs(image, x, y, color);}}}
}

200. 岛屿数量 - 力扣(LeetCode)

class Solution {int m, n, ret;boolean[][] vis;int[] dx = {0, 0, -1, 1};int[] dy = {-1, 1, 0, 0};public int numIslands(char[][] grid) {m = grid.length; n = grid[0].length;vis = new boolean[m][n];for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {if(grid[i][j] == '1' && vis[i][j] == false) {ret++;dfs(grid, i, j);}   }}return ret;    }public void dfs(char[][] grid, int i, int j) {if(grid[i][j] == '0') return;grid[i][j] = '0';for(int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == '1') {dfs(grid, x, y);}}}
}

695. 岛屿的最大面积 - 力扣(LeetCode)

class Solution {int m, n, ret, count;boolean[][] vis;int[] dx = {0, 0, -1, 1};int[] dy = {-1, 1, 0, 0};public int maxAreaOfIsland(int[][] grid) {m = grid.length; n = grid[0].length;vis = new boolean[m][n];for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {if(grid[i][j] == 1 && !vis[i][j]) {count = 0;dfs(grid, i, j);ret = Math.max(ret, count);} }}    return ret;}public void dfs(int[][] grid, int i, int j) {if(grid[i][j] == 0) return;vis[i][j] = true;count++;for(int k = 0; k < 4; k++) {int x = i + dx[k];int y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && (grid[x][y] == 1) && (vis[x][y] == false)) {dfs(grid, x, y);}}}
}

130. 被围绕的区域 - 力扣(LeetCode)

class Solution {int m, n;int[] dx = {0, 0, -1, 1};int[] dy = {-1, 1, 0, 0};public void solve(char[][] board) {m = board.length;n = board[0].length;for(int i = 0; i < n; i++) {if(board[0][i] == 'O') dfs(board, 0, i);if(board[m - 1][i] == 'O') dfs(board, m - 1, i);}    for(int j = 0; j < m; j++) {if(board[j][0] == 'O') dfs(board, j, 0);if(board[j][n - 1] == 'O') dfs(board, j, n - 1);}for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {if(board[i][j] == '.') board[i][j] = 'O';else if(board[i][j] == 'O') board[i][j] = 'X';}}}public void dfs(char[][] board, int i, int j) {board[i][j] = '.';for(int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O') {dfs(board, x, y);}} }
}

417. 太平洋大西洋水流问题 - 力扣(LeetCode)

class Solution {int m, n;int[] dx = {0, 0, -1, 1};int[] dy = {-1, 1, 0, 0};public List<List<Integer>> pacificAtlantic(int[][] h) {m = h.length;n = h[0].length;boolean[][] pac = new boolean[m][n];boolean[][] atl = new boolean[m][n];for(int i = 0; i < m; i++) {dfs(h, i, 0, pac);dfs(h, i, n - 1, atl);}for(int j = 0; j < n; j++) {dfs(h, 0, j, pac);dfs(h, m - 1, j, atl);}List<List<Integer>> ret = new ArrayList<>();for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {if(pac[i][j] && atl[i][j]) {List<Integer> tmp = new ArrayList<>();tmp.add(i); tmp.add(j);ret.add(tmp);}}}return ret;}public void dfs(int[][] h, int i, int j, boolean[][] vis) {vis[i][j] = true;for(int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && h[x][y] >= h[i][j]) {dfs(h, x, y, vis);}}}
}

529. 扫雷游戏 - 力扣(LeetCode)

class Solution {int m, n;int[] dx = {0, 0, -1, 1, 1, 1, -1, -1};int[] dy = {-1, 1, 0, 0, 1, -1, 1, -1};public char[][] updateBoard(char[][] board, int[] click) {m = board.length; n = board[0].length;int x = click[0], y = click[1];if(board[x][y] == 'M') {board[x][y] = 'X';return board;}dfs(board, x, y);return board;}public void dfs(char[][] board, int i, int j) {int count = 0;for(int k = 0; k < 8; k++) {int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'M') {count++;}}if(count == 0) {board[i][j] = 'B';for(int k = 0; k < 8; k++) {int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E') {dfs(board, x, y);}}} else {board[i][j] = (char)(count + '0');}}
}

LCR 130. 衣橱整理 - 力扣(LeetCode)

class Solution {int m, n, k, ret;boolean[][] vis;int[] dx = {0, 1};int[] dy = {1, 0};public int wardrobeFinishing(int _m, int _n, int _k) {k = _k; m = _m; n = _n;vis = new boolean[m][n];dfs(0,0);return ret;}public boolean check(int i, int j) {int tmp = 0;while(i != 0) {tmp += i % 10;i /= 10;}while(j != 0) {tmp += j % 10;j /= 10;}return tmp <= k;}public void dfs(int i, int j) {ret++;vis[i][j] = true;for(int k = 0; k < 2; k++) {int x = i + dx[k], y = j + dy[k];if(x < m && y < n && check(x, y) && !vis[x][y]) {dfs(x, y);}}       }
}

专题六 记忆化搜索

62. 不同路径 - 力扣(LeetCode)

class Solution {int m, n;public int uniquePaths(int _m, int _n) {m = _m; n = _n;int[][] memo = new int[m + 1][n + 1];return dfs(m, n, memo);}public int dfs(int i, int j, int[][] memo) {if(memo[i][j] != 0) {return memo[i][j];}if(i == 0 || j == 0) {return 0;}if(i == 1 && j == 1) {memo[i][j] = 1;return 1;}memo[i][j] = dfs(i - 1, j, memo) + dfs(i, j - 1, memo);return memo[i][j];}
}

300. 最长递增子序列 - 力扣(LeetCode)

class Solution {int[] memo;int n, ret;public int lengthOfLIS(int[] nums) {n = nums.length;memo = new int[n];for(int i = 0; i < n; i++) {ret = Math.max(ret, dfs(nums, i));}return ret;}public int dfs(int[] nums, int pos) {if(memo[pos] != 0) return memo[pos];int ret = 1;for(int i = pos + 1; i < n; i++) {if(nums[i] > nums[pos]) {ret = Math.max(ret, dfs(nums, i) + 1);}}memo[pos] = ret;return ret;}
}

375. 猜数字大小 II - 力扣(LeetCode)

class Solution {int[][] memo;public int getMoneyAmount(int n) {memo = new int[n + 1][n + 1];return dfs(1, n);}public int dfs(int left, int right) {if(left >= right) return 0;if(memo[left][right] != 0) return memo[left][right];int ret = Integer.MAX_VALUE;for(int i = left; i <= right; i++) {int x = dfs(left, i - 1), y = dfs(i + 1, right);ret = Math.min(ret, Math.max(x, y) + i);}memo[left][right] = ret;return ret;}
}

329. 矩阵中的最长递增路径 - 力扣(LeetCode)

class Solution {int[][] memo;int m, n;int[] dx = {0, 0, -1, 1};int[] dy = {-1, 1, 0, 0};public int longestIncreasingPath(int[][] matrix) {m = matrix.length; n = matrix[0].length;memo = new int[m][n];int ret = 0;for(int i = 0; i < m;i++) {for(int j = 0; j < n; j++) {ret = Math.max(ret, dfs(matrix, i, j));}}   return ret;}public int dfs(int[][] matrix, int i, int j) {if(memo[i][j] != 0) return memo[i][j];int ret = 1;for(int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] > matrix[i][j]) {ret = Math.max(ret, dfs(matrix, x, y) + 1);}}memo[i][j] = ret;return ret;}
}

相关文章:

  • 纯Java实现STDIO通信的MCP Server与客户端验证
  • 普通 html 项目引入 tailwindcss
  • Go小技巧易错点100例(二十八)
  • 应用层自定义协议序列与反序列化
  • 数据赋能(209)——质量管理——时效性原则
  • 模型测试报错:有2张显卡但cuda.device_count()显示GPU卡数量只有一张
  • 昇腾的CANN是什么?跟英伟达CUDA的有什么联系和区别?【浅谈版】
  • 智能决策支持系统的系统结构:四库架构与融合范式
  • P1537 数字反转(升级版)详解
  • 【unity游戏开发入门到精通——UGUI】整体控制一个UGUI面板的淡入淡出——CanvasGroup画布组组件的使用
  • 深入探索 AAC 编码原理与 ADTS 格式:音频世界的智慧结晶
  • MCP多智能体消息传递机制(Message Passing Between Agents)
  • 注入内部Bean
  • 数据结构---
  • Scrapy框架之【settings.py文件】详解
  • Xilinx FPGA | 管脚约束 / 时序约束 / 问题解析
  • Qwen3:快慢思考融合,一键启停
  • 【Vue】性能优化与调试技巧
  • ipvsadm,是一个什么工具?
  • MySQL 中日期相减的完整指南
  • 广西科学调度保障春灌面积1373.53万亩
  • 叙利亚多地遭以色列空袭
  • 取消了“仅退款”,商家就可以高枕无忧了吗?
  • AI世界的年轻人|他用影像大模型解决看病难题,“要做的研究还有很多”
  • 沈晓萍︱严金清:比斯坦因更早获得敦煌文物的无锡名士
  • 新华时评:需要“重新平衡”的是美国心态