20201007:力扣209週週賽題解記錄(上)

IMMUNIZE發表於2020-10-07

力扣209週週賽題解記錄(上)

題目

    1. 特殊陣列的特徵值
      在這裡插入圖片描述
    1. 奇偶樹
      在這裡插入圖片描述

思路與演算法

  1. 第一題單純的暴力就行,應該是可以用二分之類的改善複雜度,沒必要贅述,直接上暴力遍歷,帶註釋。
  2. 第二題典型的按層遍歷的BFS,使用佇列資料結構實現,自己構建一個帶level標籤的資料型別比較方便。

程式碼實現

    1. 特殊陣列的特徵值
class Solution {
    public int specialArray(int[] nums) {

        int len = nums.length;
        // 遍歷,特徵值最大為len
        for (int i = 0; i <= len; i++) {
            // 清零計數
            int cnt = 0;
            // 判斷陣列比當前i大的值有幾個,直到找到那個符合條件的,則為特徵值
            for (int num : nums) {
                if (num >= i) {
                    cnt++;
                }
            }
            if (cnt == i) {
                return i;
            }
        }
        return -1;
    }
}
    1. 奇偶樹
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    // 自定義工具類儲存節點和當前level
    class Mypair{
        TreeNode node;
        int index;
        Mypair(TreeNode node,int index){
            this.node = node;
            this.index = index;
        }
    }

    public boolean isEvenOddTree(TreeNode root) {
        // 新建佇列將其level也傳入
        Queue<Mypair> queue = new ArrayDeque<>();
        // root的level為0
        queue.add(new Mypair(root,0));
        int pre = Integer.MIN_VALUE;
        int cur = -1;

        while (!queue.isEmpty()) {
            // 獲取隊首的節點和索引進行判斷
            Mypair tmp = queue.poll();
            TreeNode tmpNode = tmp.node;
            int tmpIndex = tmp.index;
            // 一定記得處理這個特殊情況
            if (tmpNode == null) {
                continue;
            }

            // 層之間的轉移情況,根據層的奇偶性來初始化pre
            if (cur != tmpIndex) {
                // 偶數層和奇數層因為排序的要求,更新並設定不同的pre
                if (tmpIndex % 2 == 0) {
                    pre = Integer.MIN_VALUE;
                } else {
                    pre = Integer.MAX_VALUE;
                }
                cur = tmpIndex;
            }

            // 如果當前層數為偶數層
            if (cur % 2 == 0) {
                // 偶數層若出現偶數或不符合單調遞增,則返回false
                if (tmpNode.val % 2 == 0 || tmpNode.val <= pre) {
                    return false;
                } 
              // 如果當前層數為奇數層  
            } else if (cur % 2 != 0) {
                // 奇數層若出現奇數或不符合單調遞減,則返回false
                if (tmpNode.val % 2 != 0 || tmpNode.val >= pre) {
                    return false;
                }
            }
            // 一輪結束將已遍歷的節點設為pre
            pre = tmpNode.val;
            // 剩下的BFS即可
            queue.add(new Mypair(tmpNode.left, tmpIndex+1));
            queue.add(new Mypair(tmpNode.right, tmpIndex+1));
        }
        return true;
    }
}

複雜度分析

  1. 第一題複雜度為O(N²),樹的複雜度不做討論。

相關文章