当前位置:首页 > 力扣 > 力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

2天前

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界 二叉搜索树 二叉树 二叉树遍历 数据结构 算法 中序遍历 深搜 映射 第1张

题目解读‌:
二叉搜索树的世界里,每个节点都默默记录着自己的数值。现在我们需要找出这些数值中出现频率最高的那些数字,也就是所谓的"众数"。有趣的是,二叉搜索树本身具有左小右大的特性,这为我们解决问题提供了天然的便利。题目要求我们找出所有出现次数最多的元素,当多个数字出现次数相同时,需要全部返回。

解题思路‌:
采用中序遍历+频率统计的经典解法。首先通过中序遍历将BST的所有节点值按升序存入数组,这个过程中BST的有序特性得到了充分利用。接着,代码使用一个足够大的数组来统计每个数值出现的频率,这里巧妙地将数值范围[-100000,100000]映射到数组索引[0,200000]。统计完所有数值的频率后,找出最大出现次数,最后收集所有达到这个最大次数的数值。这种方法虽然使用了额外空间,但思路清晰,实现简单,是解决此类问题的典型范例。

代码注释:

class Solution {
public:
    vector<int> tree; // 存储中序遍历结果的容器
    int sum[200001]={0}; // 频率统计数组,覆盖[-100000,100000]范围
    
    // 中序遍历二叉搜索树
    void inorder(TreeNode* root) {
        if(!root) return; // 递归终止条件
        inorder(root->left); // 遍历左子树
        tree.push_back(root->val); // 将当前节点值加入数组
        inorder(root->right); // 遍历右子树
    }
    
    vector<int> findMode(TreeNode* root) {
        vector<int> ret; // 结果容器
        inorder(root); // 执行中序遍历
        
        // 统计每个数值出现的频率
        for(int i=0;i<tree.size();i++)
            sum[tree[i]+100000]++; // 数值+100000映射到数组索引
            
        int maxsum=0; // 记录最大出现次数
        // 找出最大出现次数
        for(int i=0;i<200001;i++)
            maxsum=max(maxsum,sum[i]);
            
        // 收集所有出现次数等于maxsum的数值
        for(int i=0;i<200001;i++)
            if(sum[i]==maxsum) ret.push_back(i-100000); // 还原原始数值
            
        return ret; // 返回结果
    }
};


参考:力扣501题 解题思路和步骤 C++代码实现,力扣(leetcode)

原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第1984题精解:如何通过排序将时间复杂度优化到O(n log n)?

力扣第1984题精解:如何通过排序将时间复杂度优化到O(n log n)?

题目解读给定一个整数数组和一个整数 k,需要找到所有大小为 k 的子数组中最大值与最小值的差值的最小值。例如,数组 [9,4,1,7] 中若 ...

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

题目重解给定一个仅包含'L'和'R'的字符串,要求将其分割成尽可能多的子串,且每个子串中'L'和'R'的数量相等。例如输入"R...

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

题目解读‌我们面对的是一个典型的图论问题:给定一个城市的连接矩阵,需要计算其中相互连通的城市群(省份)数量。这个问题可以抽象为无向图中的连通分量计算,每个城市代表图中的一个节点,城市之间的连接关系代表...

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

一:重新解读题目泰波那契数列是一个充满数学趣味的递推序列:从第3项开始,每个数均为前三个数的和(即Tₙ₊₃ = Tₙ + Tₙ₊₁ + Tₙ₊₂)。当给定整数n时,需要高效计算出第n项的值。面对此类递...

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

题目解读给定一个不含重复元素的整数数组,我们需要构建一棵最大二叉树。构建规则是:数组中的最大值作为根节点,其左侧子数组构建左子树,右侧子数组构建右子树,然后递归地应用这个规则。这种构建方式体现了分治思...

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

题目重解我们面对一个经典背包问题的变体:给定n个物品,每个物品有重量w和价值v,背包容量为V。需要回答两个问题:1) 普通情况下能获得的最大价值;2) 必须恰好装满背包时的最大价值(若无法装满则输出0...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。