一、給定一個二叉樹,找出其最大深度。node
注:二叉樹的深度爲根節點到最遠葉子節點的最長路徑上的節點數。數組
/** * 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; } }
二、給定一個僅包含 0 和 1 的二維二進制矩陣,找出只包含 1 的最大矩形,並返回其面積。dom
解題思路:spa
(1)首先求出高度是 1 的矩形面積,也就是它自身的數,如圖中橙色的 4,面積就是 4。code
(2)而後向上擴展一行,高度增長一,選出當前列最小的數字,做爲矩陣的寬,求出面積,對應上圖的矩形框。blog
(3)而後繼續向上擴展,重複步驟 2。索引
以此類推rem
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; } }
三、找出數組中重複的數字it
在一個長度爲n的數組裏的全部數字都在0到n-1的範圍內。數組中某些數字是重複的,但不知道有幾個數字重複了,也不知道每一個數字重複了幾回。請找出數組中任意一個重複的數字。例如,若是輸入長度爲7的數組{2, 3, 1, 0, 2, 5, 3},那麼對應的輸出是重複的數字2或者3。io
思路:從哈希表的思路拓展,重排數組:把掃描的每一個數字(如數字m)放到其對應下標(m下標)的位置上,若同一位置有重複,則說明該數字重複。
public static void main(String[] args) { //輸入數組的長度; Scanner sc = new Scanner(System.in); System.out.print("請輸入取值範圍(0~n):" + "\t"); 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); } }