开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
这里依旧是利用二叉搜索树的特性去找到众数
递归三部曲
- 确定递归的参数和返回值
找打众数,那就是返回int型。参数就是搜索树的根节点
public void findMode1(TreeNode root) {}
- 确定递归终止的条件
如果节点为空就终止
if (root == null) {
return;
}
- 确定单层递归的逻辑
就是走中序遍历呗,这里是怎么获得众数的呢?
变量的作用:
- 首先定义变量count,它是负责对
每个元素的值出现的次数计数 - 然后是maxCount,它是树中元素出现次数
最多的个数 - 变量resList,它是存放众数的结果集合
- TreeNode pre,它是存放遍历过程中的上一个节点
如何求得众数
- 首先获得节点的值,如果该节点的值不等于上一个节点的值那么就让count+1,并把该count赋值给maxCount
- 拿count的值和maxCount比较
- 如果小于maxCount那就不做操作,只把该节点的值赋值给pre
- 如果大于maxCount的值那就清空resList集合将该节点的值放到resList里面
- 如果等于那把该节点的值也加到resList里面
这样的出现次数最多的数就在resList里面了
findMode1(root.left);
int rootValue = root.val;
// 计数
if (pre == null || rootValue != pre.val) {
count = 1;
} else {
count++;
}
// 更新结果以及maxCount
if (count > maxCount) {
resList.clear();
resList.add(rootValue);
maxCount = count;
} else if (count == maxCount) {
resList.add(rootValue);
}
pre = root;
findMode1(root.right);
完整代码
没什么好说的,就是刷就完了。
class Solution {
ArrayList<Integer> resList;
int maxCount;
int count;
TreeNode pre;
public int[] findMode(TreeNode root) {
resList = new ArrayList<>();
maxCount = 0;
count = 0;
pre = null;
findMode1(root);
int[] res = new int[resList.size()];
for (int i = 0; i < resList.size(); i++) {
res[i] = resList.get(i);
}
return res;
}
public void findMode1(TreeNode root) {
if (root == null) {
return;
}
findMode1(root.left);
int rootValue = root.val;
// 计数
if (pre == null || rootValue != pre.val) {
count = 1;
} else {
count++;
}
// 更新结果以及maxCount
if (count > maxCount) {
resList.clear();
resList.add(rootValue);
maxCount = count;
} else if (count == maxCount) {
resList.add(rootValue);
}
pre = root;
findMode1(root.right);
}
}