lc22. 括号生成(MD)

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

使用回溯法。如果左括号数量不大于nn,我们可以放一个左括号;如果右括号数量小于左括号的数量,我们可以放一个右括号。当长度正好等于n×2n \times 2 时,直接返回

class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<>();
dfs(ans, new StringBuilder(), 0, 0, n);
return ans;
}

private void dfs(List<String> ans, StringBuilder cur, int open, int close, int max) {
if (cur.length() == max * 2) {
ans.add(cur.toString());
return;
}
if (open < max) {
cur.append('(');
dfs(ans, cur, open + 1, close, max);
cur.deleteCharAt(cur.length() - 1);
}
if (close < open) {
cur.append(')');
dfs(ans, cur, open, close + 1, max);
cur.deleteCharAt(cur.length() - 1);
}
}
}

lc79. 单词搜索(MD)

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:

img

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

img

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3:

img

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • boardword 仅由大小写英文字母组成

深搜题,印证了之前说过的 “回溯就当作dfs来看待” 这个说法

class Solution {
public boolean exist(char[][] board, String word) {
int n = board.length, m = board[0].length;
boolean[][] vis = new boolean[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
boolean flag = dfs(board, vis, i, j, word, 0);
if (flag) {
return true;
}
}
}
return false;
}

private boolean dfs(char[][] board, boolean[][] vis, int i, int j, String word, int k) {
if (board[i][j] != word.charAt(k)) {
return false;
} else if (k == word.length() - 1) {
return true;
}
vis[i][j] = true;
int[][] directs = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
boolean res = false;
for (int[] dir : directs) {
int newi = i + dir[0], newj = j + dir[1];
if (newi >= 0 && newi < board.length && newj >= 0 && newj < board[0].length) {
if (!vis[newi][newj]) {
boolean flag = dfs(board, vis, newi, newj, word, k + 1);
if (flag) {
res = true;
break;
}
}
}
}
vis[i][j] = false;
return res;
}
}

lc108. 将有序数组转换为二叉搜索树(EZ)

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵平衡二叉搜索树。

示例 1:

img

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

img

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 10^4
  • -104 <= nums[i] <= 10^4
  • nums严格递增 顺序排列

其实就是二分查找,直接二分法

/**
* 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 sortedArrayToBST(int[] nums) {
return binary(nums, 0, nums.length);
}

private TreeNode binary(int[] nums, int l, int r) {
if (l >= r) {
return null;
}
if (r - l == 1) {
return new TreeNode(nums[l]);
}
int mid = l + (r - l) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = binary(nums, l, mid);
root.right = binary(nums, mid + 1, r);
return root;
}
}