左神算法之中级提升(6)

news2024/12/26 10:58:28

目录

【案例1】

【题目描述】

 【思路解析】

【代码实现】

【案例2】

【题目描述】

【思路解析】

【代码实现】

【案例3】

【题目描述】

 【思路解析】

【代码实现】

【案例4】

【题目描述】 2018年美团面试题

【思路解析】

【代码实现】

【案例5】

【题目描述】

【思路解析】

 【代码实现】


【案例1】

【题目描述】

 【思路解析】

(8条消息) 详解前缀树和贪心算法_Studying~的博客-CSDN博客

(8条消息) 详解图论算法 图的宽度优先遍历 图的深度优先遍历 图的拓扑排序算法 kruskal算法 prim算法 Dijkstra算法_Studying~的博客-CSDN博客

先根据这个字符串类型的数组,先生成一个前缀树,然后再对这个前缀树进行深度优先遍历,在深度优先遍历时,根据层数来控制输出的空格即可。

【代码实现】

import java.util.HashMap;

/**
 * @ProjectName: study3
 * @FileName: Ex1
 * @author:HWJ
 * @Data: 2023/7/24 15:38
 */
public class Ex1 {
    public static void main(String[] args) {
        String[] folderPaths = {"a\\b\\c", "b\\f\\k"};
        ex(folderPaths);
    }

    public static void ex(String[] folderPaths){
        Node node = generateFolderTree(folderPaths);
        process(node, 0);
    }

    // 构建前缀树
    public static Node generateFolderTree(String[] folderPaths){
        Node head = new Node(" "); // 系统根目录,前缀树头节点
        for (String folderPath : folderPaths) {
            //  folderPath.split("\\\\") 的split函数里面即含转义匹配又含正则匹配
            // 通过转义匹配  \\\\ 被解释为 \\ , \\再通过正则匹配解释为 \,所以这\\\\最终被解释为\。
            String[] paths = folderPath.split("\\\\");
            Node cur = head;
            for (int i = 0; i < paths.length; i++) {
                // 根据前缀树规则,如果不存在这条路径就新建,存在就复用
                if (!cur.nextMap.containsKey(paths[i])){
                    cur.nextMap.put((paths[i]), new Node(paths[i]));
                }
                cur = cur.nextMap.get(paths[i]);
            }
        }

        return head;
    }

    // 深度优先遍历
    public static void process(Node node, int level){
        if(level != 0){
            System.out.println(print2Space(level) + node.name);
        }
        for (Node cur : node.nextMap.values()) {
            process(cur, (level + 1));
        }

    }

    // 得到相应的空格
    public static String print2Space(int n){
        String s = "";
        for (int i = 1; i < n; i++) {
            s += "  ";
        }
        return s;
    }

}

class Node {
    public String name;
    public HashMap<String, Node> nextMap;

    public Node(String name) {
        this.name = name;
        this.nextMap = new HashMap<>();
    }
}

【案例2】

【题目描述】

【思路解析】

这里使用二叉树的递归套路,假设一个以Node节点开头的二叉树,如果他的左子树能转为一个双向链表,且他的右子树也能转为一个双向链表,则我们只需要将左子树的双向链表的末尾连向Node节点,右子树的双向链表的开头连向Node节点。然后左子树的双向链表的头,右子树的双向链表的尾就作为整个双向链表的头和尾。

【代码实现】

/**
 * @ProjectName: study3
 * @FileName: Ex2
 * @author:HWJ
 * @Data: 2023/7/29 9:08
 */
public class Ex2 {
    public static void main(String[] args) {

    }

    public static Node convert(Node head){
        if (head == null){
            return null;
        }
        return process(head).start;
    }

    // 搜索二叉树转为双向链表后返回的头和尾信息。
    public static class Info{
        public Node start;
        public Node end;

        public Info(Node start, Node end) {
            this.start = start;
            this.end = end;
        }
    }

    // 节点类
    public static class Node{
        public int value;
        public Node right;
        public Node left;

        public Node(int value) {
            this.value = value;
        }
    }

    public static Info process(Node X){
        if (X == null){
            return new Info(null, null);
        }
        Info leftHeadEnd = process(X.left);
        Info rightHeadEnd = process(X.right);
        if (leftHeadEnd.end != null){
            leftHeadEnd.end.right = X;
            X.left = leftHeadEnd.end;
        }
        if (rightHeadEnd.start != null){
            X.right = rightHeadEnd.start;
            rightHeadEnd.start.left = X;
        }
        return new Info(leftHeadEnd.end != null ? leftHeadEnd.end : X,
                rightHeadEnd.end != null ? rightHeadEnd.end : X);
    }
}

【案例3】

【题目描述】

找到一颗二叉树中,最大的搜索二叉子树,返回最大搜索二叉子树的头结点。

 【思路解析】

对于这个二叉树的任意一个节点X,有两种情况。

(1) 他作为最大搜索二叉子树的头结点。则他需要满足左子树是搜索二叉树,右子树是搜索二叉树。左子树的最大值小于X节点的值,右子树的最小值大于X节点的值。

(2)他不作为最大搜索二叉子树的头结点。 需要他左子树的最大搜索二叉子树的头结点和大小的信息,还有需要他右子树的最大搜索二叉子树的头结点和大小的信息。通过比较大小,就得到了以X节点下的最大搜索二叉子树。

所以对于任意一个节点我们需要他的信息为,以他为头结点的子树是否是搜索二叉树,子树的最大值,子树的最小值,子树的最大搜索二叉子树的头节点,子树的最大搜索二叉子树的大小。

【代码实现】

/**
 * @ProjectName: study3
 * @FileName: Ex3
 * @author:HWJ
 * @Data: 2023/7/29 9:48
 */
public class Ex3 {
    public static void main(String[] args) {

    }

    public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int value) {
            this.value = value;
        }
    }

    public static class Info {
        public Node head; // 最大搜索二叉子树的头结点
        public int max; // 这颗树的最大值。
        public int min; // 这棵树的最小值
        public boolean isBst; // 这棵树是否为搜索二叉树
        public int size; // 最大搜索二叉子树的大小

        public Info(Node head, int max, int min, boolean isBst, int size) {
            this.head = head;
            this.max = max;
            this.min = min;
            this.isBst = isBst;
            this.size = size;
        }
    }

    public static Info process(Node x) {
        if (x == null) {
            return new Info(null, Integer.MIN_VALUE, Integer.MAX_VALUE, true, 0);
        }
        Info leftBst = process(x.left);
        Info rightBst = process(x.right);
        int min = Math.min(x.value, Math.min(leftBst.min, rightBst.min));
        int max = Math.max(x.value, Math.max(leftBst.max, rightBst.max));
        boolean isBst = false;
        int size = Math.max(leftBst.size, rightBst.size);
        Node head = size == leftBst.size ? leftBst.head : rightBst.head;
        if (leftBst.isBst && rightBst.isBst) {
            if (leftBst.max < x.value && x.value < rightBst.min) {
                size = leftBst.size + rightBst.size + 1;
                isBst = true;
                head = x;
            }
        }
        return new Info(head, max, min, isBst, size);
    }

}

【案例4】

【题目描述】 2018年美团面试题

【思路解析】

设计两个变量,max和cur,max初始为系统最小Integer.MIN_VALUE,cur初始为0,遍历数组,cur+=arr[i],如果能使max更新则更新,如果不能则不变,如果cur<0,则使cur=0;

【代码实现】

/**
 * @ProjectName: study3
 * @FileName: Ex4
 * @author:HWJ
 * @Data: 2023/7/29 11:00
 */
public class Ex4 {
    public static void main(String[] args) {

    }

    public static int getMaxScore(int[] arr){
        if (arr == null || arr.length == 0){
            return 0;
        }
        int cur = 0;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < arr.length; i++) {
            cur += arr[i];
            max = Math.max(cur, max);
            cur = Math.max(cur, 0);
        }
        return max;
    }
}

【案例5】

【题目描述】

子矩阵只能为长方形或者正方形。

【思路解析】

利用矩阵压缩技巧,对于子矩阵则它有多种情况,最优解可以出现在 第i行到第j行的最优长方形中,所以我们遍历各种矩阵,然后将矩阵压缩成一个一维数组,然后找到这个一维数组的最优解。

 【代码实现】

/**
 * @ProjectName: study3
 * @FileName: Ex5
 * @author:HWJ
 * @Data: 2023/7/29 11:12
 */
public class Ex5 {
    public static void main(String[] args) {

    }

    public static int getMaxMatrix(int[][] map){
        if (map == null || map.length == 0 || map[0].length == 0){
            return 0;
        }
        int max = Integer.MIN_VALUE;
        int cur = 0;
        int[] s = null;
        // 开始的行号i
        for (int i = 0; i < map.length; i++) {
            s = new int[map[i].length];
            for (int j = i; j < map.length; j++) { // 以i行号开始,以j行号结尾
                cur = 0;
                for (int k = 0; k < map[0].length; k++) {
                    s[k] += map[j][k];
                    cur += s[k];
                    max = Math.max(cur, max);
                    cur = Math.max(0, cur);
                }
            }
        }
        return max;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/807036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Service Mesh之Istio部署bookinfo

给istio部署插件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 rootk8s-master01:/usr/local# cd istio rootk8s-master01:/usr/local/istio# ls samples/addons/ extras grafana.yaml jaeger.yaml kiali.yaml prometheus.yaml RE…

AMD技术泄露?CPU加密技术面临新的危机

许多AMD CPU中的破解加密、泄露密码的漏洞可能需要几个月才能修复。 “Zenbleed”漏洞影响了所有基于Zen 2架构的Ryzen、Threadripper和EPYC处理器。 技术泄露情况 谷歌零项目安全团队成员Tavis Ormandy称&#xff0c;许多AMD新一代消费级、工作站和服务器处理器最近被曝出漏…

招商银行秋招攻略和考试内容详解

招商银行秋招简介 招商银行是一家股份制商业银行&#xff0c;银行的服务理念已经深入人心&#xff0c;在社会竞争愈来愈烈的今天&#xff0c;招商银行的招牌无疑是个香饽饽&#xff0c;很多人也慕名而至&#xff0c;纷纷向招商银行投出了简历。那么秋招银行的秋招开始时间是多…

感受野(Receptive Field)的理解与计算

一、 定义 在卷积神经网络中&#xff0c;感受野&#xff08;Receptive Field&#xff09;是指特征图上的某个点能看到的输入图像的区域&#xff0c;即特征图上的点是由输入图像中感受野大小区域的计算得到的。 神经元感受野的值越大表示其能接触到的原始图像范围就越大&#…

Java编译期与运行期优化探究

一: 即时编译器优化技术一览 1.编译器策略&#xff08;compiler tactics&#xff09; 延迟编译(delayed compilation) 分层编译(tiered compilation) 栈上替换(on-stack replacement) 延迟优化(delayed reoptimization) 静态单赋值表示(static single assignment representat…

电脑选睡眠、休眠还是关机?

关机 这是大家最熟悉的。关机时&#xff0c;系统首先关闭所有运行中的程序&#xff0c;然后关闭系统后台服务。随后&#xff0c;系统向主板请求关机&#xff0c;主板断开电源的供电使能&#xff0c;让电源切断对绝大多数设备的供电&#xff08;只剩一些内部零件仍会维持电源供应…

(20)(20.4) 飞行前测试控制装置

文章目录 20.4 飞行前测试控制装置 20.5 测试失控保护 20.6 减少控制的滞后性 20.4 飞行前测试控制装置 在第一次飞行之前&#xff0c;你应该测试所有的功能是否工作良好。 要检查上述控制措施的移动方向是否正确&#xff1a; 在操纵杆设置屏幕上单击"启用"按钮…

手机卡商家套路有哪些?我说的这几种你肯定遇到过!

大家好&#xff0c;我是51物联卡葫芦妹&#xff0c;我忍不住了&#xff0c;今天要给大家曝光几种常见的手机卡宣传骗术。 其实是这样的&#xff0c;昨晚有个粉丝问我&#xff0c;他私信我说让我帮他看看某个卡靠不靠谱&#xff0c;名曰超神卡&#xff0c;月租69块钱&#xff0…

多线程之GCD应用

一些套话 GCD全称是Grand Central Dispatch&#xff0c;它是纯 C 语言&#xff0c;并且提供了非常多强大的函数 GCD的优势&#xff1a; GCD 是苹果公司为多核的并行运算提出的解决方案GCD 会自动利用更多的CPU内核&#xff08;比如双核、四核&#xff09;GCD 会自动管理线程的…

Vue输入内容/链接生成二维码

方式一&#xff1a;qrcode&#xff08;无 icon 图标&#xff09; npm i qrcodejs2 --save完整代码 <template><div class"flex-box"><div>qrcode&#xff08;无 icon 图标&#xff09;</div><div class"qr-code" ref"qrCo…

MySQL Windows版本下载及安装时默认路径的修改

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、MySQL 下载二、默认路径修改1、安装前准备【非常重要】2、启动安装程序总结1、MySQL下载2、MySQL默认路径修改前言 MySQL 被Oracle收购后,各种操作规范及约束也相应的跟着来了,这不,只…

Linux服务器增加虚拟交换内存

文章目录 swap分区的创建1、查看磁盘使用情况2、添加Swap分区3、对交换文件格式化并转换为swap分区4、挂载并激活分区5、查看新swap分区是否正常添加并激活使用6、修改 fstab 配置&#xff0c;设置开机自动挂载该分区7、查看是否已经使用了交换内存 更改Swap配置查看当前的swap…

浅谈自动化测试

谈谈那些实习测试工程师应该掌握的基础知识&#xff08;一&#xff09;_什么时候才能变强的博客-CSDN博客https://blog.csdn.net/qq_17496235/article/details/131839453谈谈那些实习测试工程师应该掌握的基础知识&#xff08;二&#xff09;_什么时候才能变强的博客-CSDN博客h…

linux 指令最后一期

bc ---- linux下的计算器 bc 是一个计算器 我们输入&#xff1a;quit 来退出这个计算器 我们可以这样来用&#xff1a; uname -r uname –r指令&#xff1a; 语法&#xff1a;uname [选项] 功能&#xff1a; uname用来获取电脑和操作系统的相关信息。 补充说明&#xff1a…

springboot框架下,请使用@ConfigurationProperties替代@Value加载配置

一、背景 程序启动时&#xff0c;详细报错见下&#xff1a; 10:40:31.965 [main] ERROR org.springframework.boot.SpringApplication - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘redisDi…

【设计模式——学习笔记】23种设计模式——外观模式Facade(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基本介绍类图出场角色 案例实现案例一类图代码实现 案例二类图代码实现 外观模式在Mybatis源码中的应用总结文章说明 案例引入 在家庭影院中&#xff0c;要享受一场电影&#xff0c;需要如下步骤&#xff1a; 直接用遥控器&#xff1a;统筹各设备开关开…

De Bruijin序列与魔术(一)——De Bruijin序列简介

早点关注我&#xff0c;精彩不错过&#xff01; 欢迎回到数学魔术系列&#xff01;久违了&#xff01; 在牌序领域&#xff0c;一个特别数学化也是很冷门的一个序&#xff0c;DeBruijin序列&#xff0c;算是经典中的经典了。但它在魔术圈里流传并不甚广的原因是&#xff0c;可扩…

再创佳绩!数据猿荣获《2023金融科技影响力品牌》奖

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 7月26日至27日&#xff0c;CFS2023第十二届财经峰会暨2023可持续商业大会在北京举行&#xff0c;峰会期间举行了开幕式、高层论坛、CFS致敬盛典、2023品牌创新展等主题活动&#xff0c;以及多场关于数字化转型、金融创新、新…

一分钟搞定谷歌浏览器无法翻译的问题

文章目录 前言一、找到hosts.xml文件二、以记事本方式打开hosts文件三、在hosts文件最下方加入以下内容&#xff0c;点击保存&#xff1a;四、刷新DNS五、关闭google浏览器重新打开即可。 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 据CSDN消息&…

【Java 高频面试闯关秘籍】大梦谁先觉,平生我自知

一、mysql使用innodb引擎&#xff0c;请简述mysql索引的最左前缀如何优化orderby语句&#xff1f; 关键点&#xff1a; &#xff08;1&#xff09;如果排序字段不在索引列上&#xff0c;filesort有两种算法&#xff1a;mysql就要启动双路排序和单路排序 &#xff08;2&#x…