二叉树(四)经典算法题目解析,公共祖先,二叉树构造,非递归遍历

华为OD机考编程题全解析:从核心考点到AI辅助备考实战 数据结构与算法是计算机科学的核心基础,它们通过特定的组织与计算逻辑,高效解决各类实际问题。理解数组、链表、栈、队列、哈希表等数据结构的特性,以及排序、查找、递归、动态规划等算法思想,是评估开发者问题抽象与解决能力的关键。在工程实践中,这些技术价值体现在提升软件性能、保障系统稳定及优化资源利用上,广泛应用于搜索引擎、推荐系统、路径规划等场景。针对技术招聘中的编程能力考核,如华为OD机试,系统掌握这些核心考点并运用AI编程工具进行高效备考,已成为求职者提升竞争力的重要路径。本文聚焦华为OD机考,深入解析其高频考 阅读详情

前言❤️❤️

hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
这篇博客会解析7道二叉树的经典算法题目,这7道题目相比二叉树(三)中的题目,综合难度是有提升的,思路和代码都不算简单
初学数据结构的铁汁建议多画一点时间,细品下每个题目,二叉树解题能力就会有个很大的提升
这个专栏的数据结构是代码都是用Java来写的,JavaSE专栏现在已经全部更新完成,铁汁们复习基础知识时非常推荐使用,可以试一下💪💪💪
在这里插入图片描述
🎇个人主页:洋不写bug的博客
🎇所属专栏:数据结构专栏
🎇复习Java基础知识:Java学习之旅,从入门到进阶
🎇铁汁们对于数据结构基础的各种核心知识(不太常用的也有😆),都可以在上面的数据结构专栏学习,专栏正在持续更新中🐵🐵,有问题可以写在评论区或者私信我哦~

1,二叉树的最近公共祖先

在这里插入图片描述
力扣链接

这个题目的难度还是比较大的,首先需要分析例子,总结出规律,就以示例1中的树结构为例,多分析几种情况

  • 1和5的公共祖先为3,最小公共祖先为3
  • 2和7的公共祖先为2、5、3,最小公共祖先为2
  • 2和6的公共祖先为5、3,最小公共祖先为5
  • 8和4的公共祖先为3,最小公共祖先为3
  • 6和5的公共祖先为5、3,最小公共祖先为5

在这里插入图片描述

p和q与公共祖先的位置无非就是下面三种情况:

  1. p/q就是公共祖先(前面分析的第一种情况和第二种情况)
  2. p/q在公共祖先的左子树中
  3. p/q在公共祖先的右子树中

结合上面5种情况分析下,会得到这样一个规律,如果是最近的公共祖先,p和q与公共祖先的位置关系分布在这3种情况的两种之中;如果不是最近的公共祖先,p和q与公共祖先的位置关系分布在这3种情况的一种之中

这个规律确实不太好分析,举例来验证下,2和7的公共祖先有2、5、3;
对于3来说,2和7都属于它的左子树,p和q属于这三种情况中的一种;对于5来说,2和7都属于它的右子树,p和q属于这三种情况的一种;对于2来说,2是公共祖先,7是公共祖先的左子树,p和q就属于三种情况中的两种,因此2是最小公共祖先



写代码时大概思路就是:遍历整棵树,对每个结点查找左子树中是否包含p/q,右子树中是否包含p/q,以及当前结点是否就是p/q,这三种查找符合的话就返回1,最后计算这三种查找的和,如果等于2,就说明当前结点就是最小公共祖先

需要写个int类型的find方法,里面传入3个参数:root、p、q;递归的调用find方法,来遍历二叉树的每个结点;find的返回类型为int,但是需要返回的是公共祖先的结点,因此就可以搞个成员变量lca,在OJ题目中如果使用成员变量,一定要每次都把lca的值重新更新下

代码如下,但是这个写法有一处写错了,铁汁们可以分析下是哪里

class Solution {

    private TreeNode lca = null;


    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        lca = null;
        if(root == null){
            return null;
        }
        if(root == p || root == q){
            return root;
        }
        find(root,p,q);
        return lca;
    }

    public int find(TreeNode root,TreeNode p,TreeNode q){
        if(root == null){
            return 0;
        }
        int mid = (root == p || root == q) ? 1 : 0;
        int left = find(root.left,p,q);
        int right = find(root.right,p,q);

        if(mid + left + right == 2){
            lca = root;
        }

        return mid + left + right;
    }
}

写错的地方是find方法的返回值,不应该是返回mid + left + right,就比如调用find(root.left,p,q),就是看在左子树中能不能找到p和q这两个结点,无论是只找到p或者p,还是p和q都找到了,find方法的返回值都是1

换句话说,find方法的返回值只有1和0两种选择,如果把find方法的返回值写成mid + left + right,那find(root.left,p,q)如果p和q都在root,left子树上,那返回值就是2,这是不符合find方法的作用的

find方法的返回值就需要修改为mid + left + right > 0 ? 1 : 0,因为find方法只看有没有找到,不看找到了几个



接着画图分析下递归过程,当root为2这个结点时,满足mid + left + right的值等于2,lca赋值,lca只赋值一次,在find方法中递归,是会递归到每个结点的,就算lca已经赋值完成,find还是会把其余的结点都遍历一遍

在这里插入图片描述

这个题目的强度算是二叉树中比较大的了,就算把规律分析出来,代码也并不是很好写,铁汁们可以多画一点时间细品下这个题目,能够很好的锻炼代码能力

2,通过先序和中序序列构造二叉树

在这里插入图片描述
力扣链接

在二叉树(一)博客中已经详细解析了如何通过两个序列来还原出二叉树,在4.规律分析中,想要复习下的铁汁可以看下

拿示例1中的树来说,简单分析下构建过程:

  1. 先序序列的第一个元素是根结点,3就是树的根结点
  2. 再把3拿到中序中查找,9是左子树,15、20、17是右子树
  3. 再回到前序序列中来看,20、15、17是3的右子树的先序遍历的结果,此时20就是根结点
  4. 拿着20去对应的中序结果中15、20、17中查找,15是20的左子树,17是20的右子树



总结下,从preorder中从前往后遍历,拿到根结点,取出3这个元素,在inorder中查找,3.left就是9构成的子树,3.right就是(15、20、7)构成的子树

这里就有个问题需要解决,3是第一个结点,所以我们知道,在中序序列中,3左子树就是3左边的元素,3的右子树就是3右边的元素,接下来继续遍历preorder,拿到9这个元素,在中序序列中怎么看呢,难道说9的右子树是9右边的所有元素吗,这显然是不对的

因此,就需要搞两个int类型的变量,inLeft和inRight,这两个参数记录的是当前要创建的子树在中序中元素的分布范围,是前闭后开的,也就是[inLeft,inRight),当然铁汁们设置为前闭后闭也可以

就比如说从preorder中遍历到20这个元素了,拿着20在inorder中去查找,如下图,这时候[inLeft,inRight)就表示以20为根结点的子树在中序中的范围,在这个范围内,20.left就是20左边的元素,20.right就是20右面的元素

在这里插入图片描述



首先写个findPos方法,在preorder中遍历取出元素之后,使用findPos查找元素在inorder中的位置,为了提高效率,还可以传入inLeft和inRight,直接在inorder的这片区域上找

写个buildHelper方法,递归构建子树,里面传入inLeft和inRight,遍历preorder,取出root,接着用findPos方法查找root在inorder中的位置pos,root.left在inorder中的位置就是(inLeft,pos),root.right在inorder中的位置就是(pos + 1,inRight)

还需要创建个成员变量index,记录preorder遍历到的位置,注意每次要把index清0,那这里为什么不用for循环来preorder呢,多方便,但是这里buildTreeHelper是要递归调用的,写for循环每次递归都要重新跑一遍for循环,就成无限循环了😅

class Solution {

    private int index = 0;

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        index = 0;
        return buildTreeHelper(preorder,inorder,0,inorder.length);
    }

    public TreeNode buildTreeHelper(int[] preorder, int[] inorder,int inLeft,int inRight){
        if(inLeft >= inRight){
            return null;
        }
        if(index >= preorder.length){
            return null;
        }

        TreeNode root = new TreeNode(preorder[index]);
        index++;
        int pos = findPos(inorder,inLeft,inRight,root.val);
        root.left = buildTreeHelper(preorder,inorder,inLeft,pos);
        root.right = buildTreeHelper(preorder,inorder,pos + 1,inRight);
        return root;

    }

    public int findPos(int[] inorder,int inLeft,int inRight,int val){
        for(int i = inLeft;i < inRight;i++){
            if(inorder[i] == val){
                return i;
            }
        }
        return -1;

    }
}



这个题目如果铁汁们细品一下,是不用写这个if判断的,因为当index走到preorder.length位置的时候,再调用buildTreeHelper方法,inLeft是一定大于等于inRight的,就直接返回null了

        if(index >= preorder.length){
            return null;
        }

3,通过后序后中序序列构造二叉树

在这里插入图片描述
力扣链接

这个题目跟上个比较类似,preorder是从前往后遍历,postorder改为从后往前遍历就行了,后序序列中,从后往前遍历是先根结点,后右子树,再左子树,构建树的顺序改一下即可

class Solution {

    private int index = 0;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        index = postorder.length - 1;
        return buildTreeHelper(inorder,postorder,0,inorder.length);
    }

    public TreeNode buildTreeHelper(int[] inorder, int[] postorder,int inLeft,int inRight){
        if(inLeft >= inRight){
            return null;
        }
        TreeNode root = new TreeNode(postorder[index]);
        index--;
        int pos = findPos(inorder,inLeft,inRight,root.val);
        root.right = buildTreeHelper(inorder,postorder,pos + 1,inRight);
        root.left = buildTreeHelper(inorder,postorder,inLeft,pos);
        return root;
    }

    public int findPos(int[] inorder,int inLeft,int inRight,int val){
        for(int i = inLeft;i < inRight;i++){
            if(inorder[i] == val){
                return i;
            }
        }
        return -1;
    }
}

4,根据二叉树创建字符串

在这里插入图片描述
力扣链接

题目的意思就是在先序遍历的结果上,加上括号表示子树,就比如示例1,(2(4))和(3)就是1的左子树和右子树

在这里插入图片描述



还需要注意一点,当一个结点的左子树为空,右子树不为空时,还要额外的加上个空括号,就比如示例2中,2的左子树为空,就写成(2()(4)),其他情况下都是不需要加空括号的

在这里插入图片描述


这个题目就是在先序遍历中,加入一些添加括号的逻辑,对于子树来说,就是先在根结点外打印括号,接着里面加入元素,例如示例1中的(2(4))

写代码的时候创建个StringBuilder类型的成员变量result,再整个void类型的tree2strHelper方法,在里面递归构建字符串
在result中添加完成root.val,的时候,还需要判断下左子树是否为空,如果为空,就添加一个()

结果最外层是没有括号的(根结点是一个特例),还需要用deleteCharAt方法把最外层的括号给删除掉

class Solution {

    private StringBuilder result = new StringBuilder();
    public String tree2str(TreeNode root) {
        if(root == null){
            return " ";
        }
        result = new StringBuilder();
        tree2strHelper(root);
        result.deleteCharAt(0);
        result.deleteCharAt(result.length() - 1);
        return result.toString();
    }

    public void tree2strHelper(TreeNode root){
        if(root == null){
            return;
        }
        result.append("(");
        
        result.append(root.val);
        if(root.left == null && root.right != null){
            result.append("()");
        }
        tree2strHelper(root.left);
        tree2strHelper(root.right);
        result.append(")");

    }
}

5,二叉树的前序遍历(非递归)

在这里插入图片描述
在这里插入图片描述

力扣链接

前序遍历递归代码大家都会写,这个题目最下方提到说能否通过迭代的方式来完成前序遍历,在面试中为了考量代码能力,这种要求是很有可能提出来的

递归的关键就是“回溯”,例如前序遍历,先访问根结点,再访问左子树,再访问右子树;左子树的结点都访问完成后,就会回溯到根结点,再访问根结点的右子树

我们就可以使用栈,来模拟左子树递归完成,回溯到根结点,再去访问右子树的情况,具体分为以下几步:

  1. 创建栈,根结点入栈
  2. 接着循环的把栈顶元素出栈,访问这个元素
  3. 把右子树先入栈,再把左子树入栈,因为栈的特点是后进先出
  4. 下次循环取出的栈顶元素就是左子树的根结点,访问这个元素,把这个元素的左子树和右子树再入栈
  5. 当整个左子树的结点都访问完成后,出栈就轮到了右子树的根结点
class Solution {

    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode cur = stack.pop();
            result.add(cur.val);
            if(cur.right != null){
                stack.push(cur.right);
            }
            if(cur.left != null){
                stack.push(cur.left);
            }
        }
        return result;
    }

}

铁汁们可以拿示例2中的那棵树代入方法,看下迭代过程,这里博主就不画图了

6,二叉树的中序遍历(非递归)

在这里插入图片描述

在这里插入图片描述
力扣链接

中序遍历是先递归左子树,再访问根结点,最后递归右子树

中序遍历一上来不能访问根结点,要访问根结点的左子树,访问到左子树的根结点后,还是不能继续访问,要等到左子树为空时,才能访问根结点,步骤如下

  1. 从根结点触发,一路入栈左子树,直到遇到左子树为空的情况
  2. 当出现左子树为空的情况时,就说明当前结点可以访问了,访问栈顶元素(出栈),把这个元素加入到list中
  3. 再取到栈顶元素的右子树根结点,重复第一个步骤,一路入栈左子树,直到遇到左子树为空的情况

代码如下,个人感觉中序遍历的代码要比前序遍历难想,非常建议铁汁们找个树结构,代入代码,模拟下栈出入队列的过程🐵

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while(true){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }

            if(stack.isEmpty()){
                break;
            }
            TreeNode top = stack.pop();
            result.add(top.val);
            cur = top.right;
        }
        return result;
    }
}

7,二叉树的后序遍历(非递归)

在这里插入图片描述
在这里插入图片描述
力扣链接

后序遍历的特点就是当左子树和右子树都访问过了,才去访问根结点

后序遍历和中序遍历都是先访问左子树,因此起手式是一样的,都是从根结点开始,一路左子树入栈,直到左子树为空,单靠左子树为空是不能访问栈顶结点的,还要判断右子树的情况

步骤如下:

  1. 如果右子树为空,就可以直接访问栈顶结点
  2. 如果右子树不为空,已经被访问过了,也可以直接访问栈顶结点
  3. 如果右子树不为空,并且没有被访问,那就拿到右子树的根结点,继续重复前面的步骤:一路左子树入栈,直到左子树为空

那如何去判断右子树有没有被访问过呢?

因为是后序遍历,完成遍历后,倒数第一个结点是根结点,倒数第二个结点就是右子树的根结点,也就是说,如果右子树被访问过了,那上一次出栈的元素就是右子树的根结点,我们就可以维护一个TreeNode类型的引用prev,记录最近一次出栈的栈顶元素,判断时只需要比较下prev是否与右子树的根结点相同即可

class Solution {

    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        TreeNode prev = null;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while(true){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            if(stack.isEmpty()){
                break;
            }
            TreeNode top = stack.peek();
            if(top.right == null || top.right == prev){
                result.add(top.val);
                stack.pop();
                prev = top;
            }else{
                cur = top.right;
            }
        }
        return result;
    }
}

结语

  • 二叉树(二)(三)(四)博客都是解析二叉树的相关算法,这部分内容也经常被称为数据结构中最难的部分,难的就是递归算法的分析,学习这部分内容最好的方法就是画图细品
  • 到这篇博客,数据结构中的知识已经解析了一多半了,最难的部分也已经过去了,恭喜铁汁们🎉🎉,下篇博客会解析堆



以上就是今天的所有内容啦~完结撒花~🥳🎉🎉

在这里插入图片描述

深信服校招算法练习卷考点解析:从数据结构到机器学习 校招算法岗的考察并非单一刷题,而是综合数据结构、经典算法与机器学习基础。动态规划强调重叠子问题与最优子结构,KMP通过next数组利用前后缀信息减少匹配回溯。理解这些算法原理,才能在实际笔试中灵活应对变形题。算法技术不仅用于LeetCode,更落地于网络安全中的异常流量检测、日志聚类等场景。在此基础上,机器学习中的XGBoost、注意力机制以及ELBO与KL散度等概念,也日益成为企业考查的加分项。本文以深信服校招算法练习卷为例,拆解考点逻辑、题型权重与常见调试陷阱,帮助备考者构建系统化复习路径。 阅读详情

相关推荐

猎豹移动研发工程师笔试题攻略:高频考点与实战解法

计算机基础是研发工程师笔试的基石,无论C++、Java还是算法,都在考察候选人对数据结构、操作系统、网络协议等核心概念的掌握程度。理解原理才能应对千变万化的题目,比如C++虚函数析构、HashMap并发问题、TCP的TIME_WAIT状态,这些常见考点背后都对应着明确的技术机制。扎实的基础知识不仅用于笔试,更是客户端、服务端日常开发中排查问题、设计方案的底层能力。从经典算法到Linux调试,从多线程同步到内存管理,工程实践中遇到的挑战往往能在基础原理中找到答案。本文基于猎豹移动研发工程师笔试的题型风格,梳理

weixin_34101784的博客 428

二叉树OJ题

例如我们cur位于节点4的时候是无法用后继指针指向节点6的,因为还没有获取到节点,但是如果我们到达节点6后prev就会到达节点4,而这时候反而可以建立4->6的后继指针联系~只需要看上一次访问的节点是否为右子树的根,如果是则代表已经访问过了,那么就可以访问当前的节点。如果不是,则说明右子树还没有访问,则暂且不访问当前节点,转而访问其右子树~我们通过让cur的前驱指针指向prev,再让prev更新为cur的方式可以把所有节点的前驱指针都布置完毕,那么后继指向要怎么做呢?

fax_player的博客 1189

直击高频编程考点:树相关知识及经典算法题总结

树相关知识及编程练习总结:背景知识+树的应用举例(Spring中的应用举例+其他框架中的应用举例+实际开发中的应用举例)+相关编程练习(二叉树遍历:包括前序遍历、中序遍历、后序遍历、层序遍历等+二叉树的最大深度+二叉树的最小深度+对称二叉树+二叉树的最近公共祖先+二叉树的直径+二叉树的路径和+二叉搜索树中的插入操作+二叉搜索树中的删除操作+二叉搜索树中的搜索操作+二叉树的层平均值+二叉树的镜像+二叉树的序列化与反序列化+二叉树的右视图+二叉树的最大宽度+前序遍历和中序遍历构造二叉树+平衡二叉树)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

【Java--数据结构】二叉树oj题(下)

如有错误,欢迎指出~

2301_80898480的博客 1172

5个4000比特大状态置换算法的设计与分析

下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。

HuangJinLong2的博客 342

ANSYS APDL实战:手把手教你搞定电磁-热耦合分析(附完整命令流)

本文通过一个工业感应加热线圈的实战案例,手把手教你使用ANSYS APDL完成电磁-热耦合分析。内容涵盖从几何建模、材料定义、网格划分到加载求解及后处理的完整流程,重点讲解了使用PLANE13单元进行双向耦合场分析的方法与命令流调试技巧,助力工程师快速掌握这一核心仿真能力。

weixin_29284201的博客 419

二叉树核心性质与遍历算法:从递归到经典面试题全解析

数据结构是计算机科学的基础,而二叉树作为最典型的非线性结构,其节点关系与递归特性深刻影响着算法设计的思维方式。理解二叉树的关键在于掌握其基本性质,例如第i层最多有2^(i-1)个节点、叶子节点数n0与度为2的节点数n2满足n0 = n2 + 1,这些性质不仅是选择题的高频考点,更是推导复杂结论的基石。在此基础上,前序、中序、后序与层序遍历构成了所有树形算法题的通用框架,递归与迭代两种实现方式分别对应系统栈的隐式调用与显式模拟。掌握遍历的访问时机,就能解决求深度、翻转、判断平衡与对称、寻找最近公共祖先、路径求

优快云头条 454

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图:Discuz X3.5的系统信息,上传许可为1024MB(1GB)论坛为局域网论坛,仅供内部同事交流使用!使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图:选择上传附件(提示可以最大上传100M) 下图:模拟上传84M的文件(

骚团长的博客 1828

Leedcode刷题顺序

刷题

qq_39751446的博客 1289

利用netmq在相机应用于unity之间传输图像数据

Unity工业相机接入方案解析 本文探讨了在Unity中接入不同品牌工业相机的技术方案。研究发现: Basler相机可直接调用官方DLL(pylonc.net.dll)实现接入 海康和大恒相机因驱动DLL依赖C++组件,无法直接调用 解决方案:通过独立进程(相机应用程序)与Unity进行通信,采用NetMQ实现图像数据传输 技术实现要点: 相机端:使用PublisherSocket发布JPEG图像帧 Unity端:通过SubscriberSocket订阅图像数据 优化:设置高水位线控制缓存帧数,避免数据堆积

weixin_46450859的博客 417

YOLOv8的特征蒸馏代码应用讲解(CWD/MGD/mimic/在线蒸馏/逻辑蒸馏)

基于YOLOv8的逻辑蒸馏、特征蒸馏、在线蒸馏等方法代码介绍。

qq_41920323的博客 2582

二叉树后序遍历从递归到迭代:原理、实现与高频考点解析

在树结构相关算法中,深度优先遍历是最基础也最常见的操作,而其中后序遍历因遵循“左-右-根”的访问顺序,天然契合自底向上的处理逻辑。理解这一原理,不仅能帮助开发者写出正确的递归版本,更能理解为何迭代实现中需要借助栈或状态标记来延迟根节点的访问。迭代后序遍历在避免递归栈溢出、提升程序健壮性方面具有重要价值,同时广泛应用于二叉树深度计算、整树删除、表达式求值等经典场景。当面对算法面试中的高频考点时,掌握后序遍历的多种实现方式,有助于真正理解二叉树的操作时机与控制流。本文以此为切入点,拆解后序遍历的核心难点与实际应

weixin_31102231的博客 253

PyTorch实战(20)——生成对抗网络(Generative Adversarial Network,GAN)

自生成对抗网络 (Generative Adversarial Network, GAN) 提出以来,一直是一个活跃的研究和开发领域。本节探索了 GAN 的基本概念,重点解析了其两大核心组件——生成器与判别器的架构设计,深入阐述了 GAN 模型的整体工作机制,并使用 PyTorch 从零开始实现了深度卷积生成对抗网络 (Deep Convolutional GAN, DCGAN)。

盼小辉丶的博客 3510

LeetCode笔记

LeetCode笔记数组哈希表 数组哈希表 1.两数之和 暴力解法需要两遍遍历,时间复杂度O(n2)。使用哈希表的思想将目标差值对应的数组序号存储起来。如果当前的nums[i]没有找到目标数字时将nums[i]的位置i存储在数组arr[target - nums[i]]的位置,也就是说若存在数字target - nums[i],则进行匹配时可以直接找到与其匹配的nums[i]的位置i var tw...

pspdragon的博客 421

【文献笔记】CVPR 2023|Attention-Based Point Cloud Edge Sampling

优点能够有效采出点云数据的边缘点分类任务性能优越不足没有设计出一个更好的上采样方法,导致分割任务的性能略低只考虑了边缘特征,没有利用其他几何特征。

m0_55908255的博客 318

基于Simulink的PID控制汽车巡航控制系统建模与仿真

汽车巡航控制系统(Cruise Control System)是一种通过自动调节发动机输出功率来维持车辆以恒定速度行驶的技术。这种系统能够减轻驾驶员在长途驾驶中的疲劳,同时提高燃油经济性和行车安全性。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于汽车巡航控制系统中。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的汽车巡航控制系统,重点研究PID参数调优方法、系统动态响应特性以及稳态误差消除能力。

MHD0815的博客 196

新疆大学828数据结构考研全攻略:从基础到复试的深度解析与规划

数据结构是计算机科学的核心基础,它研究数据的组织、存储和操作方式,其核心原理在于通过逻辑结构(如线性表、树、图)和物理结构(如顺序存储、链式存储)的高效结合来解决实际问题。掌握数据结构的技术价值在于能够显著提升算法效率与程序性能,是构建复杂软件系统和进行高性能计算的基石,广泛应用于搜索引擎、数据库管理、操作系统和人工智能等领域。对于报考新疆大学计算机技术(085404)与计算机科学与技术(081200)专业的考生而言,深入理解并熟练应用数据结构中的**递归/分治算法**与**迭代/贪心算法**等核心思想,是

weixin_34015336的博客 357

【ESP32设备通信】-两个ESP32间UART通信

在本文中,我们将使用 Arduino IDE 的 UART 硬件库在两个 ESP32 板之间执行 UART 或串行通信。 要使用 USB 端口调试和编程 ESP32,需要使用称为通用异步接收器/发送器 (UART) 通信的串行端口。 对于大多数传感器和系统,主要的通信方法被认为是 UART。 为了共享工作负载、信息和执行不同的任务,有时需要在两个 ESP32 开发板之间进行通信。

视觉与物联智能 2992

OJ训练进阶指南:第三周算法能力突破策略

算法训练是程序员提升编程能力的核心路径,其中时间复杂度优化和数据结构选择是关键基础。通过系统化的OJ(Online Judge)训练,开发者能掌握分治、回溯等经典算法思想,有效提升解题效率。本文聚焦训练关键期第三周,详解如何通过五步解题法、错题本机制等方法突破算法瓶颈,特别适合正在刷LeetCode中级题的程序员。内容涵盖二叉树非递归遍历、边界条件处理等高频考点,提供可视化调试、测试用例库等工程实践技巧,帮助训练者建立完整的算法思维体系。

weixin_32520095的博客 232

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

新疆大学828数据结构考研:算法设计能力提升与高频考点精析

数据结构是计算机科学的核心基础,它研究数据的组织、存储和操作方式,直接影响程序的效率和性能。其核心原理在于通过逻辑结构(如线性表、树、图)和物理存储结构的有效结合,实现数据的高效管理。掌握数据结构对于提升算法设计能力、优化软件性能具有关键价值,广泛应用于数据库索引、编译器设计、网络路由等场景。在考研专业课复习中,精准把握目标院校的高频考点和命题风格至关重要。本文聚焦新疆大学计算机技术专业(085404)的初试科目“828数据结构”,深入解析其以“算法设计题”为核心的考核重点,并围绕“链表”和“二叉树遍历”等

weixin_30263073的博客 446

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

leetcode刷题记录

对于这道题有两种解法。第一种暴力枚举:时间复杂度O(n^2)空间复杂度O(1)第二种哈希表查找:判断target - 数组元素是否存储在哈希表中,如果不在就将数组元素作为键,数组下标作为索引存入哈希表中,如果在则直接输出相对应的索引下标。

m0_71235225的博客 918

2024秋招小米算法岗笔试复盘:从KMP到树形背包的实战指南

算法岗笔试是秋招的重要关卡,扎实的数据结构与算法基础是应对各类编程题的前提。KMP字符串匹配算法和动态规划是笔试中的高频考点,前者考察对next数组推导的准确理解,后者则常以背包问题变形出现,需要掌握状态设计与复杂度优化。深入理解这些经典算法的原理与技术价值,能帮助候选人在有限时间内高效解题。在实际笔试场景中,排序算法稳定性、机器学习理论与深度学习基础也常以选择题形式出现。以2024年小米算法岗第二批笔试为例,完整复盘了从收到通知到交卷的全过程,梳理了KMP、动态规划、树形依赖背包、机器学习、智能优化算法等

weixin_33804582的博客 573

数据结构C语言版学习全攻略:从教材选择到面试准备

数据结构是计算机专业的核心基础课,而C语言作为底层编程语言,能直观呈现数据在内存中的存储与操作方式,是理解数据结构本质的最佳工具。从顺序表与链表的对比,到栈、队列、树、图等经典结构的原理剖析,再到查找与排序算法的复杂度分析,这门课不仅锻炼递归思维与指针运用能力,更直接关联考研复试、期末上机与求职面试。无论是严蔚敏经典教材、王道考研辅导,还是大话数据结构的趣味入门,都需要配合实验报告与课程设计来落地实践。本文梳理了一条系统的学习路径,涵盖环境搭建、代码调试、刷题策略与高频考点,帮助零基础或自学者高效掌握这门硬

weixin_34279579的博客 212

2025华为Java岗面试高频考点与备战全攻略

Java技术面试是检验开发者基础功底与工程实践能力的关键环节,尤其在大厂招聘中,对JVM内存模型、并发编程、集合框架等底层原理的考察日益深入。理解这些核心概念不仅有助于应对面试中的连环追问,更能帮助开发者构建稳固的知识体系。在实际项目中,无论是排查线上性能问题,还是设计高并发缓存方案,都离不开对这些基础原理的灵活运用。从面向对象特性到Spring容器机制,从MySQL索引优化到Redis缓存一致性,再到手撕算法的实战演练,系统梳理各模块高频考点与答题思路,是高效备战技术面试的重要路径。本文聚焦Java后端方

weixin_34194087的博客 382

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

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

Mysssone的博客 166

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

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

wuqingyigexiaoba的博客 224
上一篇: 滑动窗口算法详细解析(8道经典题目)
下一篇: 堆的解析,堆和优先级队列的实现,比较规则制定
洋不写bug
博客等级 码龄2年 87粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值