java基礎編程題(2)

一、給定一個二叉樹,找出其最大深度。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);
        }

    }
相關文章
相關標籤/搜索