0
点赞
收藏
分享

微信扫一扫

单词搜索、柱状图中最大的矩形、二叉树的后序遍历

单词搜索

给定一个 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;
    }
}

本文内容到此结束了, 如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问💬欢迎各位大佬指出。 主页:共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

举报

相关推荐

0 条评论