这是我参与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;
}
}
打乱数组
该题出自力扣的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;
}
}