1、给定一个二叉树,找出其最大深度。
注:二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public int maxDepth(TreeNode root) { return root == null ? 0 : Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; } }
2、给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
解题思路:
(1)首先求出高度是 1 的矩形面积,也就是它自身的数,如图中橙色的 4,面积就是 4。
(2)然后向上扩展一行,高度增加一,选出当前列最小的数字,作为矩阵的宽,求出面积,对应上图的矩形框。
(3)然后继续向上扩展,重复步骤 2。
以此类推
class Solution { public int maximalRectangle(char[][] matrix) { if (matrix.length == 0) { return 0; } //保存以当前数字结尾的连续 1 的个数 int[][] width = new int[matrix.length][matrix[0].length]; int maxArea = 0; //遍历每一行 for (int row = 0; row < matrix.length; row++) { for (int col = 0; col < matrix[0].length; col++) { //更新 width if (matrix[row][col] == '1') { if (col == 0) { width[row][col] = 1; } else { width[row][col] = width[row][col - 1] + 1; } } else { width[row][col] = 0; } //记录所有行中最小的数 int minWidth = width[row][col]; //向上扩展行 for (int up_row = row; up_row >= 0; up_row--) { int height = row - up_row + 1; //找最小的数作为矩阵的宽 minWidth = Math.min(minWidth, width[up_row][col]); //更新面积 maxArea = Math.max(maxArea, height * minWidth); } } } return maxArea; } }
3、找出数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。
思路:从哈希表的思路拓展,重排数组:把扫描的每个数字(如数字m)放到其对应下标(m下标)的位置上,若同一位置有重复,则说明该数字重复。
public static void main(String[] args) { //输入数组的长度; Scanner sc = new Scanner(System.in); System.out.print("请输入取值范围(0~n):" + " "); int n = sc.nextInt(); //题目要求的数组 ArrayList<Integer> arr = new ArrayList<>(); //去重数组 HashSet<Integer> mset = new HashSet<>(); Random ran = new Random(); //随机n次,产生n个数,存入数组中 for (int i = 0; i < n; i++) { //产生一个0~n-1之间的随机数,存入数组 int j = ran.nextInt(n); arr.add(j); mset.add(j); } System.out.println("------------------------[ 原始数据 ]------------------------"); System.out.println("随机数组值为:" + arr); System.out.println("去重参考值为:" + mset); //------------------------------------------前期准备工作------------------------------------------------------- //这时候,得到了一个符合题目要求的数组;和一个没有重复的set集合 if (arr.size() <= 0 || arr == null) { System.out.println("无效数组!"); } if (arr.size() == mset.size()) { System.out.println("数组中无重复数字!"); } else { //有重复数字,重复的数组为:arr数组减去无重复数组mset for (Integer integer : mset) { //得到该数字再arr数组中第一次的索引,删除 int i = arr.indexOf(integer); arr.remove(i); } //再去重 HashSet<Integer> list = new HashSet<>(); for (Integer i : arr) { list.add(i); } //重复数字为: System.out.println("重复的值为 : " + list); } }