由 leet501 认识二叉树中序遍历的重要性

Nano Banana 2哪里使用?Nano Banana 2提示词合集和使用教程 收集最强的Nano Banana 2提示词合集,以及Nano Banana 2哪里使用的教程,并且有10个免费使用渠道。 阅读详情
link

由该题认识到二叉树中序遍历的重要性

  1. 题目要求返回BST中所有的众数
    1. 众数:即,出现频率最高的元素
  2. 解决该题目一个重要的前置知识是
    1. 中序遍历二叉搜索树等于遍历有序数组
  3. 有了前置知识铺垫之后,问题就转化成了,在有序数组中查找出现次数最多的元素

我自己的解决思路

  1. 首先中序遍历二叉搜索树,把元素放到list集合中去
  2. 然后,遍历list把出现次数最多的元素找出来
class Solution {

    private List<Integer> list = new ArrayList<>();

    public int[] findMode(TreeNode root) {
        // 中序遍历二叉搜索树
        traverse(root);
        // 二叉搜索树的大小
        int n = list.size();
        // 重复次数最多的元素 放到 ans 集合中去
        List<Integer> ans = new ArrayList<>();
        // 用max_cnt记录记录元素最多出现的次数
        // 用 cnt 记录当前元素出现的次数
        int max_cnt = -1,cnt = 0;
        // 初始化第一个元素的值
        int init = list.get(0);
        // 双指针
        int left = 0,right = 0;
        while(right < n) {
            if(list.get(right) == init) {
                // 如果元素连续相等
                cnt++;
                right++;
            } else {
                if(cnt == max_cnt) {
                    ans.add(list.get(left));
                }
                if(cnt > max_cnt) {
                    ans.clear();
                    max_cnt = cnt;
                    ans.add(list.get(left));
                }
                left = right;
                init = list.get(left);
                cnt = 0;
            }
        }
        //  最后一个元素出现的次数是不是最多之一
        if(cnt == max_cnt) {
            ans.add(list.get(left));
        }
        // 最后一个元素出现的次数是不是最多
        if(cnt > max_cnt) {
            ans.clear();
            ans.add(list.get(n-1));
        }
        return ans.stream().mapToInt(i -> i).toArray();
    }

    private void traverse(TreeNode root) {
        if(root == null) {
            return;
        }
        traverse(root.left);
        list.add(root.val);
        traverse(root.right);
    }

}
  • 除去递归调用所占用的空间之外,我额外使用了一个list来存储二叉树中所有的元素,空间复杂度为 O ( n ) O(n) O(n)
  • 通过学习官方题解
    • 在遍历二叉树树的过程中,实际上可以把出现最多次数的元素直接存入到list集合中去
    • 这里不照抄官方题解,学习思路,独立实现一下子
  • 优化之后的代码
class Solution {

    private List<Integer> list = new ArrayList<>();

    // 用于和树节点中值比较的初始化元素
    private int init;
    // 维护变量出现的最大次数
    private int maxCnt;
    // 当前变量出现的次数
    private int cnt;

    public int[] findMode(TreeNode root) {
        traverse(root);
        return list.stream().mapToInt(i -> i).toArray();
    }

    private void traverse(TreeNode root) {
        if(root == null) {
            return;
        }

        traverse(root.left);

        deal(root.val);

        traverse(root.right);
    }

    private void deal(int localVal) {
        if(localVal == init) {
            cnt++;
        } else {
            init = localVal;
            cnt = 1;
        }
        // 这里根据自己第一版代码进行优化,没想到和管解一样了,干的不错,继续加油
        if(cnt == maxCnt) {
            list.add(init);
        } else if(cnt > maxCnt) {
            list.clear();
            list.add(init);
            maxCnt = cnt;
        }
    }

}

参考

https://leetcode.cn/problems/find-mode-in-binary-search-tree/solution/er-cha-sou-suo-shu-zhong-de-zhong-shu-by-leetcode-/

Android 14.0 SystemUI状态栏居中显示时间和修改时间显示样式 在14.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了 阅读详情

相关推荐

LangChain开发避坑指南:为什么Pylance总提示‘无法解析导入‘?实测7种修复方案

本文深入解析了在VS Code中使用LangChain开发时,Pylance频繁提示‘无法解析导入’的根本原因——Python解释器与语言服务器的环境路径不一致。文章提供了从基础排查到深度配置的7种实测修复方案,包括切换解释器、配置extraPaths、使用pyrightconfig.json等,旨在帮助开发者彻底解决此问题,提升AI应用开发效率。

weixin_28826521的博客 447

OD机试-采样过滤

算法-OD-机试-采样过滤

记录成长的过程 1094

TI电机驱动应用中MOSFET选型完整指南

深入解析TI电机驱动设计中MOSFET的选型关键,涵盖参数匹配、热性能与开关效率,帮助工程师优化系统性能并提升能效,是掌握MOSFET应用的核心参考。

weixin_42263617的博客 1270

最大区间值

题目描述 给定一个数组序列,要求选出一个区间。使得该区间是所有区间中经过如下计算之后得出的值最大的一个: 计算规则:区间中最小的数✖️区间所有数的和 最程序输出经过计算的最大值即可,不需要输出具体的区间 如给定序列 [6,2,1] 经过计算后的最大值为:36 解题思路-java ​ 两个关键点是 区间中最小的数、区间所有数的和。单个元素可以被认为是一个区间。然后就是在找到区间中最小的数的同时,如何 计算其区间和。 public int getMax(int[] numbers) { if

记录成长的过程 992

微信自动化进阶:Python识别特定消息并自动回复(基于win32api控件操作)

本文详细介绍了如何使用Python和win32api实现微信消息的智能监控与自动回复。通过精准识别聊天记录中的特定关键词,结合多级匹配策略和性能优化技巧,构建稳定高效的自动化回复系统,适用于企业客服、个人助手等场景。

weixin_42663213的博客 441

避坑指南:RK3588视频编码与SRT推流实战中,我遇到的5个典型问题及解决方案

本文深度解析RK3588平台视频编码与SRT推流实战中的五个典型问题,包括MIPI摄像头内存对齐、多线程数据传递、FFmpeg时间戳设置、SRT连接参数调优及系统资源监控。提供具体解决方案和优化技巧,帮助开发者高效实现实时视频网络传输。

weixin_28718793的博客 324

二分查找学习总结心得

二分查找一般运用在有序数组中的查找,一般分为开区间、闭区间和半开半闭区间三种写法。

记录成长的过程 723

机器学习项目(四)疫情期间网民情绪识别 (一)

疫情期间网民情绪识别 赛题背景 2019新型冠状病毒(2019-nCoV)感染的肺炎疫情发生对人们生活生产的方方面面产生了重要影响,并引发国内舆论的广泛关注,众多网民参与疫情相关话题的讨论。为了帮助政府掌握真实社会舆论情况,科学高效地做好防控宣传和舆情引导工作,本赛题针对疫情相关话题开展网民情绪识别的任务。 数据介绍 训练集 10万条 无标记样本90万条 测试集1万条 数据集依据与“新冠肺炎”相关...

qq_33357094的博客 8972

快递投放问题

N。

记录成长的过程 650

解决Anaconda环境下catkin_make编译报错:Python路径冲突与empy模块缺失

本文详细分析了在Anaconda环境下使用catkin_make编译时出现的Python路径冲突与empy模块缺失问题,提供了快速解决方案和永久性环境配置方法。通过显式指定Python解释器路径或调整Anaconda配置,有效解决编译报错问题,适用于ROS开发与科学计算并行的场景。

weixin_28829629的博客 353

Google账号找回通用方法(尤其是知道账号密码仍无法登录和找回的)

Google账号找回通用方法【尤其是知道账号密码仍无法登录和找回的】普通找回注意:适用于常用谷歌账户的设备和网络情况下无法使用手机或辅助邮箱验证码进行密码找回特殊找回方法注意;适用于1.新的设备以及网络环境(包括由于非正常原因导致设备系统以及应用信息变更)2.没有开启辅助验证(手机/邮箱)3.知道账号密码但无法登录或找回。通过申诉进行找回 普通找回 注意:适用于 常用谷歌账户的设备和网络情况下 无法使用手机或辅助邮箱验证码进行密码找回 通过恢复页面进行恢复 https://accounts.google

极客代码-极致生活 23万+

1016. 子串能表示从 1 到 N 数字的二进制串--这道题能学到不少东西

my god 我的天,是真滴复杂。

记录成长的过程 614

【温室气体数据集】CAMS 发布的温室气体(GHG)数据集总结

【温室气体数据集】CAMS 发布的温室气体(GHG)数据集总结

WW、forever的博客 555

几何平均值最大子数组

从一个长度为N的正数数组numbers中找出长度至少为L且 几何平均值 最大的子数组,并输出其位置和大小。(K个数的 几何平均值 为K个数的乘积的K次方根)若有多个子数组的几何平均值均为最大值,则输出长度最小的子数组。若有多个长度相同的子数组的几何平均值均为最大值,则输出最前面的子数组。

记录成长的过程 595

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

KMP算法

如下图 匹配到 字符 s 的时候,发生不匹配,这是最佳方案应是 第一个字符 a 与 s进行匹配。,是由 D.E.Knuth、J.H.Morris 和 V.R.Pratt 三位大佬一起捣鼓出来的。所以我们需要去知道模式串已经匹配过的部分的位置,KMP算法使用一个数组保存位置信息。为什么字符串后面全是 c 结果对应位置记忆数组的值全是0?当发现不匹配的时候——去寻找之前已经匹配过的部分中,模式串的。所以,字符 c 对应记忆数组的位置应是0。,强调的是快,那咋快的呢?模式串在匹配主串的过程中。

记录成长的过程 528

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法学习-通过二分法深入理解递归思想

递归是什么? 简而言之,方法可以调用自己。我个人在最初学习递归的时候总是容易陷入循环地思考之中。为了更好地学习递归的思想。从二分法开始深入。 通过二分法理解递归思想 给定一个指定的数值key,在自增有序数组nums中寻找其是否存在。我们可以循环目标数组,取出每一个元素与目标值相比较。这是我能够想到的最直观的解决办法。 public static int search(int key, int[] nums) { for(int i = 0;i < nums.length;i++) {

记录成长的过程 521

树相关知识点--零碎笔记

二叉树的前中后序遍历是什么?后序遍历有什么特殊之处?为什么多叉树没有中序号遍历?

记录成长的过程 487

推荐结果打散

推荐结果打散 题目描述 输入描述: 第一行输入为一个整数N(1~10),表示每N个结果里最多出一个图片结果 第二行输入为一个整数M(1~100),表示有M个待处理的推荐结果 第三行~第2+M行为具体的 M 个待处理结果,每行具体为:字符串 V_ 或 P_ 打头,后面接输入时0~M-1的顺序标号 输入描述: 第1行为K,表示打散处理后结果的长度 第2~K+1行为打散后的结果,具体为:字符串 V_ 或 P_ 打头,后面接输入时 0~M-1 的顺序标号 List&lt

记录成长的过程 464

leetcode第六题Z字形变换心得记录

算法学习之路-坚持走下去 Z字形变换 题目描述 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。 请你实现这个将字符串进行指定行数变换的函数: string convert(string s, .

记录成长的过程 341

2021-03-06 一周刷题心得记录

一周练习题目记录 leetcode 206 反转链表 leetcode 92 反转链表Ⅱ leetcode 138 复制带随机指针的链表 leetcode 2 两数相加 leetcode 146 LRU缓存机制 总结回顾 学会思想最重要 leetcode 206 反转链表 题目描述 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转

记录成长的过程 294

算法学习-典型数组处理

什么是数组? 数组能够顺序存储相同类型的多个数据。访问数组中某个元素的方法是通过数组索引下标访问。数组索引下标是指,每一个数组中的元素对应一个编号。通过编号能够快捷地对数组中的元素进行访问。 Java中使用数组 创建一个数组需要三个步骤 1.声明数组:定义数组的名字和存储的数据类型 2.创建数组:创建过程完成之后才可以使用数组,创建数组的时候我们需要指定数组的长度即元素的个数 3.初始化数组元素 // 声明数组 int[] demo; // 创建数组, demo = new int[3]

记录成长的过程 244

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 244

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 193

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 320

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 595

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 125

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 22
上一篇: 踩坑二分查找-进阶
下一篇: Spring源码-浅识BeanFactory
隙间光点
博客等级 码龄10年 29粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值