算法小知识----11.22----N叉树的最大深度

203 阅读2分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

N叉树的最大深度

该题出自力扣的559题——N叉树的最大深度(简单题)

审题

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

  • 简单概括就是层序遍历的N叉树,找出其中最大的深度

  • 从题目的话可能会迷糊,直接看解答区可能会容易理解

    • class Node {
          public int val;
          public List<Node> children;
      ​
          public Node() {}
      ​
          public Node(int _val) {
              val = _val;
          }
      ​
          public Node(int _val, List<Node> _children) {
              val = _val;
              children = _children;
          }
      };
      
  • 二叉树的遍历,无非就是DFS(深度)、BFS(广度);递归的手段

  • 这次采用的是递归的手段;也踩了一些逻辑上的雷(踩雷不要紧,自己做的时候多踩,面试的时候才能少踩)

    •     public int maxDepth(Node root) {
              int sum = 1;
              return maxSum(root.children,sum);
          }
      ​
          public int maxSum(List<Node> root, int sum){
              if(root == null || root.size() == 0)return sum;
              int max = 1;
              for (Node node: root) {
                  max = Math.max(max,maxSum(node.children,max));
              }
              return sum+max;
          }
      
    • 想的是在起始就是1,所以直接把初始值设置为1;后面的逻辑就无法闭环,最大值比较,当最大层为0时,会导致结果过大错误

编码

class Solution {
    public int maxDepth(Node root) {
        if(root == null)return 0;
        int sum = 0;
        for (Node node:root.children) {
            sum = Math.max(sum,maxDepth(node));
        }
        return sum+1;
    }
}

QQ截图20211121233932.png

打乱数组

该题出自力扣的384题——打乱数组(中等题),题解消化于官方题解

审题

给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。

实现 Solution class:

Solution(int[] nums) 使用整数数组 nums 初始化对象 int[] reset() 重设数组到它的初始状态并返回 int[] shuffle() 返回数组随机打乱后的结果

  • 该题要求实现3个方法:

    • 初始化构造方法
    • 返回最初值
    • 返回打乱后的值
  • 严格来说这道题并不算是中等题,倒有点生成测试用例的味道

  • 最初的思路是:

    • 初始化一个int[] 数组,赋值为变量,返回最初值的方法也就可以直接返回类变量即可
    • 返回打乱的数组,乱序 也就离不开Random,如何实现呢,倒有点类似以前想过的仿微信红包(虽然不成立),克隆一个数组后,遍历+random下标

编码

public class Solution {
​
    int[] arr;
    int n;
    Random random;
    
    public Solution(int[] nums) {
        arr = nums;
        n = nums.length;
        random = new Random();
    }
​
    public int[] reset() {
        return arr;
    }
​
    public int[] shuffle() {
        int[] nums = arr.clone();
        for (int i = 0;i<n;i++){
            swap(nums,i,i+random.nextInt(n-i));
        }
        return nums;
    }
​
    void swap(int[] arr,int i,int j){
        int c = arr[i];
        arr[i] = arr[j];
        arr[j] = c;
    }
​
}
​

1637552648(1).jpg