leetcode(96-100)

Leetcode刷题(96~100) 本文分享了5道二叉树相关算法题的解题思路和Java代码实现:1.不同二叉搜索树的数量(动态规划);2.交错字符串的验证(动态规划);3.验证二叉搜索树(递归或中序遍历);4.恢复二叉搜索树(略);5.判断两棵树是否相同(递归比较)。文章强调算法是程序员的基本功,建议保持刷题习惯,以平和心态面对挑战。代码示例展示了动态规划在树问题中的应用以及递归的典型使用场景。 阅读详情

96. 不同的二叉搜索树

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3
class Solution {
public:
    int numTrees(int n) {
        if (n == 0) return 0;
        vector<int> res{1,1};
        for (int i = 2; i <= n; ++i){
            int tmp = 0;
            for (int j = 0; j < i; ++j){
                tmp += res[j] * res[i - j-1];
            }
            res.push_back(tmp);
        }
        return res[n];
    }
};

97. 交错字符串

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。

示例 1:

输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出: true

示例 2:

输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出: false
class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int len1=s1.size(),len2=s2.size(),len3=s3.size();
        if(len1+len2!=len3) return false;
        if(len3==0) return true;
        vector<vector<int>> dp(len1+1,vector<int>(len2+1,0));
        for(int i=0; i<=len1 && s1[i-1]==s3[i-1]; i++){
            dp[i][0]=1;
        }
        for(int i=0; i<=len2 && s2[i-1]==s3[i-1]; i++){
            dp[0][i]=1;
        }
        for(int i=1; i<=len1; i++){
            for(int j=1; j<=len2; j++){
                int k=i+j-1;
                if(s1[i-1]==s3[k] && dp[i-1][j]==1)       dp[i][j]=1;
                if(s2[j-1]==s3[k] && dp[i][j-1]==1)       dp[i][j]=1;
            }
        }
        return dp[len1][len2];
    }
};

98. 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:
    2
   / \
  1   3
输出: true

示例 2:

输入:
    5
   / \
  1   4
     / \
    3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4 。
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if(root==NULL) return true;
        vector<int> res;
        inorder(root, res);
        for(int i=0; i<res.size()-1; i++){
            if(res[i] >= res[i+1]) return false;
        }
        return true;
    }
    void inorder(TreeNode* root, vector<int>& res){
        if(root==NULL) return;
        inorder(root->left, res);
        res.push_back(root->val);
        inorder(root->right, res);
    }
};

99. 恢复二叉搜索树

二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

示例 1:

输入: [1,3,null,null,2]

   1
  /
 3
  \
   2

输出: [3,1,null,null,2]

   3
  /
 1
  \
   2

示例 2:

输入: [3,1,4,null,null,2]

  3
 / \
1   4
   /
  2

输出: [2,1,4,null,null,3]

  2
 / \
1   4
   /
  3

进阶:

  • 使用 O(n) 空间复杂度的解法很容易实现。
  • 你能想出一个只使用常数空间的解决方案吗?
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    void recoverTree(TreeNode* root) {
        TreeNode* pre=NULL;
        TreeNode* left=NULL;
        TreeNode* right=NULL;
        TreeNode* pnode=root;
        int count=0;
        stack<TreeNode*> q;
        while(!q.empty() || pnode){
            while(pnode){
                q.push(pnode);
                pnode=pnode->left;
            }
            TreeNode* cur=q.top();
            if(pre!=NULL && pre->val>cur->val){
                if(!left) left=pre;
                right=cur;
                count++;
                if(count==2) break;
            }
            pre=cur;
            pnode=cur->right;
            q.pop();
        }
        swap(left->val,right->val);
        return;
    }
};

100. 相同的树

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:       1         1
          / \       / \
         2   3     2   3

        [1,2,3],   [1,2,3]

输出: true

示例 2:

输入:      1          1
          /           \
         2             2

        [1,2],     [1,null,2]

输出: false

示例 3:

输入:       1         1
          / \       / \
         2   1     1   2

        [1,2,1],   [1,1,2]

输出: false
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if (p == NULL && q == NULL) return true;
        if (p && q) return p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
        return false;         
    }
};

(以上题目均摘自leetcode)

PCA9698嵌入式C++驱动库:高性能I²C GPIO扩展方案 GPIO扩展是嵌入式系统中解决MCU引脚资源不足的关键技术,其核心原理在于通过串行总线(如I²C)桥接主控与外设寄存器,实现逻辑引脚到物理IO的映射与状态同步。技术价值体现在低开销、高确定性与多设备可扩展性,广泛应用于工业控制、传感器节点和LED矩阵驱动等实时场景。本文聚焦PCA9698——一款支持24通道双向IO、中断输出与可编程驱动模式的I²C GPIO扩展芯片,结合其C++驱动库的影子寄存器机制、端口级原子操作及非阻塞同步设计,提供面向资源受限平台(如ATmega2560)的工程就绪方案。 阅读详情

相关推荐

骨架动作识别新突破:CTR-GCN的通道拓扑优化策略解析

本文深入解析了CTR-GCN在骨架动作识别中的通道拓扑优化策略。通过引入通道级拓扑细化,CTR-GCN克服了传统GCN共享拓扑结构的局限性,显著提升了动作识别的准确率。文章详细介绍了CTR-GCN的三大核心组件设计,包括特征变换模块、通道拓扑建模和通道聚合技术,并提供了实战调参经验和模型压缩技巧,为计算机视觉领域的研究者和开发者提供了有价值的参考。

weixin_27310417的博客 193

Leetcode(一)-数学(二)

231. 2的幂 思路:因为2的幂的二进制只含有一个1,比如4:100,3则为011,所以按位&就能得到全为000. class Solution { public: bool isPowerOfTwo(int n) { return n>0&&!(n&(n-1)); } }; 思路: class ...

Cutepingping的博客 247

逆向实战:我是如何一步步解开美团外卖App的mtgsig3.0签名(附关键代码片段)

本文详细记录了逆向分析美团外卖App的mtgsig3.0签名算法的全过程,从抓包到算法还原,包括Java层和Native层的深度分析。通过Frida、IDA Pro等工具,揭示了签名生成的多层加密流程,并提供了关键代码片段。文章还探讨了逆向工程中的反调试对抗和签名时效性问题,为安全研究人员提供了宝贵的技术参考。

weixin_42530732的博客 872

leetcode:96. 不同的二叉搜索树

题目来源 96. 不同的二叉搜索树 题目描述 题目解析 动态规划 假设n个节点存在二叉排序树的个数是G(n),令f(i)是以i为根的二叉搜索树的个数,则有 G(n)=f(1)+f(2)+f(3)+...f(n)G(n)=f(1)+f(2)+f(3)+...f(n)G(n)=f(1)+f(2)+f(3)+...f(n) n为根节点,当i为根节点时,其左子树节点个数为[1,2,3...i-1],右子树节点个数为[i+1, i+2,... n],所以当i为根节点时,其左子树节点个数为i-1个,右子树节点为n-i

OceanStar的博客 1220

iOS中.obj、.usdz、.dae和.scn格式之间的转化(思路清晰版)

作者最近在写项目的过程中遇到了一些3d模型格式问题,故写下这篇文章记录一下解决问题的过程。

yueliangmua的博客 5586

人工势场法在自动驾驶避障中的实践与优化

本文深入探讨了人工势场法在自动驾驶避障中的核心原理与实践优化。通过解析引力与斥力模型,揭示了经典算法在局部最优和目标不可达等问题上的局限性,并重点介绍了改进斥力场函数、引入道路边界斥力及动态参数调整等关键优化策略,有效提升了该局部路径规划算法在复杂动态场景下的实用性与鲁棒性。

weixin_29208327的博客 927

C++ 编程技巧

1: vector<int> res // 用vector声明一个数组, 元素为int类型 unordered_map<int, int> m // 用unordered_map声明一个无序map, key为int, val为int res.size() // vector用.size()去求解大小或去计算元素个数 m.count(key) // 查找hash_map中有没有这个key-val,返回个数 res.push_back(i) // 向容器res尾部插......

Melo琦 970

廉价却有效?ESD防护中的电容

摘要:在成本敏感型电子产品设计中,多层陶瓷电容(MLCC)可作为TVS二极管的替代方案用于静电放电(ESD)防护。其工作原理是通过电容充放电特性吸收静电能量,而非电压钳位。计算表明100nF/50V MLCC可有效缓冲8kV静电冲击,但存在吸收能量有限、无自恢复等局限。建议将MLCC作为一级缓冲措施,配合TVS等器件形成多级防护,并优先选择X7R材质、100nF容值、50V耐压的0402/0603封装MLCC。该方案在低速信号和电源引脚防护中具有显著成本优势,但不能完全替代专业ESD抑制器。

硬核科技 430

C++11新特性emplace操作

emplace操作是C++11新特性,新引入的的三个成员emlace_front、empace 和 emplace_back,这些操作构造而不是拷贝元素到容器中,这些操作分别对应push_front、insert 和push_back,允许我们将元素放在容器头部、一个指定的位置和容器尾部。

3万+

高德地图API如何使用

通过以上步骤,您可以成功接入并使用高德地图API来为您的应用添加丰富的地图功能。

QQ_778132974的博客 4785

lammps蒙特卡洛MC模拟案例

在lammps中,和MC相关的模拟命令有三个:fix gcmc、fix atom/swap、fix sgcmc。在一个lammps模拟中,mc和md可同时存在,间隔运行,所以设置fix sgcmc命令的同时,可以同时设置系综(nve、nvt或者npt)。lammps官网自带案例中也有一个fix sgcmc的案例,主要模拟FeCu合金的MC建模。sgcmc命令可应用到合金的模拟中,如短程有序模拟。MC运行间隔为100步,最终的浓度比例为0.02,也就是2%的Fe原子交换为Cu原子。大家好,我是小马老师。

lammps_jiayou的博客 1825

LeetCode 96. 不同的二叉搜索树

LeetCode 96. 不同的二叉搜索树

梦~' 743

Unreal5从入门到精通之一文搞懂Unreal的C++代码编译之谜

我们在开发Unreal项目时,如果时蓝图模板的项目,一般问题不大,因为当你修改完蓝图,点击编译Compile+保存Save,就可以继续开发了。这对于开发者来说也非常友好。但是,如果你使用的C++模板开发项目,代码编译一切都变得魔幻起来,IDE(VS/Rider)里面有编译,编辑器里面也有编译,有什么区别呢?我们来列举几个新手常碰到的问题。1.代码我明明新建了,编辑器里怎么看不到?2.昨天我新家的功能运行的好好的,今天怎么感觉还是老逻辑。或者昨天加的新代码,新蓝图不见了。

TxNet 1606

【LeetCode Solutions】LeetCode 96 ~ 100 题解

【LeetCode Solutions】LeetCode 96 ~ 100 题解

一只快乐的小蒟蒻~ 1258

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

第7题 力扣LeetCode 热题 HOT 100(96.不同的二叉搜索树)

第7题 力扣LeetCode 热题 HOT 100(96.不同的二叉搜索树) 题目 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3 输出:5 示例 2: 输入:n = 1 输出:1 提示: 1 <= n <= 19 题解 二叉搜索树,即左子树中的所有值小于根节点的值,右子树中的所有值大于根节点的值。 以n = 3 为例 当根节点值为1 时,满足二叉搜索树的情况下左子树节点数

weixin_45440200的博客 232

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【力扣hot100】 96. 不同的二叉搜索树

摘要:本文探讨了计算由n个不同节点组成的二叉搜索树种类数的问题。通过动态规划方法,将问题分解为左子树和右子树的组合计算,得出总数为左右子树种类数的乘积。代码实现中利用数组存储中间结果,逐步构建解,最终返回dp[n]作为答案。该方法巧妙地将复杂问题转化为子问题求解,展示了动态规划在树结构问题中的应用价值。

prowity的博客 533

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LeetCode 96~100

前言 本文隶属于专栏《LeetCode 刷题汇总》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构请见LeetCode 刷题汇总 正文 幕布 幕布链接 96. 不同的二叉搜索树 题解 官方题解​ 动态规划 class Solution { public int numTrees(int n) { int[] G = new int[n + 1]; G[0] = G[1] = 1; for (int i

Shockang的博客 6262

力扣爆刷第102天之hot100五连刷96-100

思路:求下一个排列,是求下一个最小的大于它的值,基本原理从下图的5, 7, 6, 4处进行寻找,寻找最小的一个大于它的数,自然要从右边开始找,找第一个凹陷处,nums[i] < nums[i+1],此时i= 5,然后再从右边找第一个大于5 的数,为6,也就是nums[j]>nums[i],此刻这个6就是最小的一个大于它的数,然后交换,交换后[i, end]为单调递减,然后翻转即可。题目链接:https://leetcode.cn/problems/single-number/description/?

qq_43511039的博客 784

【JavaScript】LeetCode:96-100

【代码】【JavaScript】LeetCode:96-100。

weixin_45980065的博客 1199

(leetcode)力扣100 96.只出现一次的数字(位运算)

摘要 本文介绍了一种利用位运算高效解决数组中找出唯一出现一次数字的方法。题目要求在非空整数数组中找到仅出现一次的元素(其他元素均出现两次),要求算法具有线性时间复杂度和常量空间复杂度。通过异或运算的特性(相同数异或结果为0,任何数与0异或保持不变),只需遍历数组将所有元素依次异或,最终结果即为目标数字。该方法简洁高效,时间复杂度O(n),空间复杂度O(1)。示例代码展示了Java实现,验证了算法的正确性。

qq_62235017的博客 70

Leetcode Hot100 第78题 96. 不同的二叉搜索树

【代码】Leetcode Hot100 第78题 96. 不同的二叉搜索树。

weixin_45850570的博客 147

力扣爆刷第122天之CodeTop100五连刷96-100

思路:堆排的思想是先从最后一个非叶子节点开始向下递归交换,直到根节点也完成了向下大小交换,此时就构建一个大根堆,只不过左右孩子的顺序不能保证,接下来就从最后一个元素开始与根节点交换,然后向下递归交换,直到所有的节点都完成从上往下交换,即可完成升序排序。思路:序列化与反序列化,序列化正常前序遍历,需要用占位符划分好节点和null值。题目链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/description/

qq_43511039的博客 610

力扣hot100题解(python版96-100题)

给你一个整数数组nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

小橘子的博客 1400

【力扣100题】96.跳跃游戏 II

思路平均时间最坏时间空间评价动态规划O(n^2)O(n^2)O(n)会超时BFSO(n^2)O(n^2)O(n)需要队列贪心(反向)O(n)O(n^2)O(1)最坏 O(n^2)贪心(正向)O(n)O(n)O(1)最优项目内容核心思想贪心:维护「当前边界」和「下一步最远」两个变量关键判断i == curEnd 时,需要再跳一次最优时间O(n)最优空间O(1)面试加分能解释这是 BFS 层序遍历的空间优化版本。

weixin_45787955的博客 170

力扣爆刷第96天之hot100五连刷66-70

思路:仔细看会发现不管旋转多少次,旋转之后都是下面的这种情况,即左边整体高于右边,那么要寻找最小值,只需要二分逐段缩小区间,至于如何缩小,请注意nums[right]一定小于nums[left],求出中值后,如果nums[right]>nums[mid]就说明中值靠左,右边不要了,更新right=mid,如果nums[right]<=nums[mid]说明中值靠右,只有nums[mid]小于nums[right]才可能出现最小值,所以更新left=mid+1.

qq_43511039的博客 946

Leetcode Hot100 96-100 技巧题

此时,应该意识到寻常的集合或者哈希表不好使了,这些都需要O(n)的辅助空间。技巧题通常都是数学题,这题使用异或运算性质。要求:设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

wjyqc_的博客 183
上一篇: leetcode(91-95)
下一篇: 机器学习---特征选择
小小螺丝刀
博客等级 码龄10年 41粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值