每日三题-二叉树的层序遍历、二叉树的中序遍历、最小覆盖子串

简介: 每日三题二叉树的层序遍历二叉树的中序遍历最小覆盖子串

二叉树的层序遍历


6f7aeb2eb4364e4ebd6ede5b75d341e6.png

解法一

BFS

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        LinkedList<TreeNode> list = new LinkedList<>();
        list.add(root);
        while(!list.isEmpty()){
            int size = list.size();
            List<Integer> l = new ArrayList<>();
            for(int i = 0;i < size;i++){
                TreeNode t = list.pop();
                l.add(t.val);
                if(t.left != null)list.add(t.left);
                if(t.right != null)list.add(t.right);
            }
            res.add(l);
        }
        return res;
    }
}


二叉树的中序遍历


7dbfbf4ec08e4831a6c1504cf509b3fb.png


解法一

递归

最简单

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        fun(root,list);
        return list;
    }
    public void fun(TreeNode root,List<Integer> list){
        if(root == null)return;
        fun(root.left,list);
        list.add(root.val);
        fun(root.right,list);
    }
}

解法二

自己维护栈

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null) return list;
        Stack<TreeNode> stack = new Stack<>();
        while(root != null || !stack.isEmpty()){
            while(root != null){
                stack.add(root);
                root = root.left;
            }
            TreeNode node = stack.pop();
            list.add(node.val);
            root = node.right;
        }
        return list;
    }
}


最小覆盖子串


02f2842ab97748ab901dfb2d237eb82f.png

解法一

暴力枚举

外层循环枚举起始值

内层循环枚举结束值

然后比较数组

class Solution {
    public String minWindow(String s, String t) {
        int slen = s.length();
        int tlen = t.length();
        if(slen < tlen) return "";
        int res = slen + 1;
        int left = 0;
        char [] arrs = s.toCharArray();
        char [] arrt = t.toCharArray();
        int [] s1 = new int[128];
        int [] t1 = new int[128];
        for(int i = 0;i < tlen;i++){
            t1[arrt[i]]++;
        }
        for(int i = 0;i < slen;i++){ // 枚举起始位置
            Arrays.fill(s1,0);
            for(int j = i;j < slen;j++){ // 枚举结束位置
                s1[arrs[j]]++;
                if(j-i+1 < tlen) continue;
                if(check(s1,t1)){
                    System.out.println(i+" "+j);
                    if(res > j-i+1){
                        res = j-i+1;
                        left = i;
                    }
                    break;
                }
            }
        }
        if(res == slen+1) return "";
        StringBuilder sb = new StringBuilder();
        for(int i = left;i < left+res;i++){
            sb.append(arrs[i]);
        }
        return sb.toString();
    }
    public boolean check(int[] arrs,int[] arrt){
        for(int i = 0;i < arrs.length;i++){
            if(arrs[i] < arrt[i]){
                return false;
            }
        }
        return true;
    }
}

解法二

滑动窗口

class Solution {
    public String minWindow(String s, String t) {
        int slen = s.length();
        int tlen = t.length();
        if(slen < tlen) return "";
        int minLen = slen + 1;
        int begin = 0;
        int left = 0;
        int right = 0;
        int distance = 0;
        char [] arrs = s.toCharArray();
        char [] arrt = t.toCharArray();
        int [] s1 = new int[128];
        int [] t1 = new int[128];
        for(int i = 0;i < tlen;i++){
            t1[arrt[i]]++;
        }
        while(right < slen){   
            //1. 如果当前字符没有在t中
            if(t1[arrs[right]] == 0){
                s1[arrs[right]]++;
                right++;
                continue;
            }
            //2. 到这里说明当前字符在t中存在
            //2.1 当left - right中这个字符的个数少于t1中这个字符个数时候才加一
            // 因为当等于或者大于的时候,说明s1中这个的字符与t1中相等或者大于,但是他实际包含的t1的长度是t1中字符的长度 
            if(s1[arrs[right]] < t1[arrs[right]]){
                distance++;
            }
            s1[arrs[right]]++;
            right++;
            //3.说明找到一个字符串满足条件了,就开始收缩左边界
            while(distance == tlen){
                if(right - left < minLen){
                    minLen = right-left;
                    begin = left;
                }
                if(s1[arrs[left]] == t1[arrs[left]]){
                    distance--;
                }
                s1[arrs[left]]--;
                left++;
            }            
        }
        if(minLen == slen + 1) return "";
        return s.substring(begin,begin+minLen);
    }
}
相关文章
|
11月前
|
安全 数据挖掘 数据安全/隐私保护
国产CRM品牌巡礼:系统品牌的核心优势与特色
本文深度解析国产CRM系统的四大知名品牌:销售易、神州云动、销帮帮和天衣云。 销售易:中国领先的CRM解决方案提供商,提供全渠道获客、智能化销售流程及AIGC技术应用,赢得500强企业信赖。 神州云动:以PaaS+SaaS模式、灵活定制和行业解决方案著称,支持企业实现客户关系管理的数字化和智能化。 销帮帮:面向中小企业的实用型CRM系统,提供销售跟踪、客户视图等功能,提高销售效率和客户满意度。 天衣云:专注于云端部署,提供快速部署、高安全性的CRM解决方案,确保企业信息安全。 各品牌各有特色,企业应根据自身需求选择合适的CRM系统,以实现客户关系的全面管理,提升业务效率和客户满意度。
|
编译器 C++
【C++】初识模板
【C++】初识模板
71 0
python中的时间处理模块(二):datetime模块之time类详解
python中的时间处理模块(二):datetime模块之time类详解
python中的时间处理模块(二):datetime模块之time类详解
|
供应链 小程序
质量基础设施一站式服务系统开发,NQI公共服务平台建设
质量基础设施一站式服务系统将以“互联网+质量服务”的共享经济模式和平台的信息优势、数据优势、科技优势,为政府部门、检验检测机构、企业和用户之间的“广谱”交流提供全新渠道,信息共享、资源共享和技术共享,将有效提升检验检测技术服务的效率,满足企业检验检测需求,实现从“最多跑一次”到“一次也不用跑”的转变,真正做到“让数据多跑腿,让企业少跑路”。
290 0
|
存储 运维 架构师
架构师到底该不该写代码?
选取了一部分大家可能会感兴趣的问题,汇总此文。
1023 0
|
安全 网络协议 网络安全
高级安全Windows防火墙概述以及最佳实践
简介 在Windows NT6.0之后微软推出了高级安全Windows防火墙(简称WFAS),高级安全Windows防火墙是分层安全模型的重要部分, 通过为计算机提供基于主机的双向网络通讯筛选, 高级安全Windows防火墙 阻止未授权的网络流量流向或流出本地计算机。
4914 0
|
2天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
3天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
351 91