单词搜索
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true
示例 3:
输入: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
- board 和 word 仅由大小写英文字母组成
**进阶:**你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?
解答:
class Solution {
public boolean exist(char[][] board, String word) {
int cl = board.length;
int rl = board[0].length;
boolean[][] flag = new boolean[cl][rl];
for (int i = 0; i < cl; i++) {
for (int j = 0; j < rl; j++) {
if (find(board, word, flag, i, j, 0))
return true;
}
}
return false;
}
public boolean find(char[][] board, String word, boolean[][] flag, int i, int j, int index) {
int cl = board.length;
int rl = board[0].length;
if (word.length() == index)
return true;
if (i < 0 || i >= cl || j >= rl || j < 0)
return false;
if (flag[i][j] || word.charAt(index) != board[i][j])
return false;
flag[i][j] = true;
boolean judge = find(board, word, flag, i - 1, j, index + 1) || find(board, word, flag, i + 1, j, index + 1)
|| find(board, word, flag, i, j - 1, index + 1) || find(board, word, flag, i, j + 1, index + 1);
flag[i][j] = false;
return judge;
}
}
柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
以下程序实现了这一功能,请你填补空白处内容:
class Solution {
public int largestRectangleArea(int[] heights) {
int length = heights.length;
if (length == 0) {
return 0;
}
int maxSize = 0;
for (int i = 0; i < length; i++) {
int nowHeight = heights[i];
int nowWidth = 0;
for (int j = i; j < length; j++) {
___________________;
nowWidth++;
if (maxSize < nowHeight * nowWidth) {
maxSize = nowHeight * nowWidth;
}
}
}
return maxSize;
}
}
解答:
if (heights[j] < nowHeight) {
nowHeight = heights[j];
}
二叉树的后序遍历
给定一个二叉树,返回它的 _后序 _遍历。 示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
解答:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> nodeStack = new Stack<>();
TreeNode nodeTemp = root;
TreeNode preNode = null;
while (nodeTemp != null || !nodeStack.isEmpty()) {
while (nodeTemp != null) {
nodeStack.push(nodeTemp);
nodeTemp = nodeTemp.left;
}
nodeTemp = nodeStack.peek();
if (nodeTemp.right == null || nodeTemp.right == preNode) {
nodeTemp = nodeStack.pop();
list.add(nodeTemp.val);
preNode = nodeTemp;
nodeTemp = null;
} else {
nodeTemp = nodeTemp.right;
}
}
return list;
}
}
本文内容到此结束了, 如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问💬欢迎各位大佬指出。 主页:共饮一杯无的博客汇总👨💻
保持热爱,奔赴下一场山海。🏃🏃🏃