左神高级进阶班3(TreeMap顺序表记录线性数据的使用, 滑动窗口的使用,前缀和记录结构, 可能性的舍弃)

news2024/12/24 3:17:47

目录

【案例1】

【题目描述】

【思路解析】

【代码实现】

【案例2】

【题目描述】

【思路解析】

【代码实现】

【案例3】

【题目描述】

【思路解析】

【代码实现】

【案例4】

【题目描述】

 【思路解析】

【代码实现】


【案例1】

【题目描述】

【思路解析】

这里大楼之间有重叠部分,然后让我们描述轮廓线数组,所以我们需要知道每个点的最大高度。因为他每一个楼中间部分是高度相等的,所以我们只需要知道这个点所在地点那个楼是最高的,并且因为楼中间部分高度相等,所以我们只关心每栋楼的开始位置和结束位置。我们可以通过matrix构建一个这样的数组【数组存放结点,结点包括位置,升降情况,高度三个信息】,数组通过位置和升降情况来进行排序,(1)先按照位置来排序,升序(2)如果两个位置相同,则开始位置(升的情况)排在前。

通过这样的顺序数组,我们就可以构建一个高度和出现的顺序表,升就添加一个记录,降就删除一个记录,如果记录为0,则删除。通过这个顺序表,就可以知道当前位置的最大高度(位置和最大高度的关系也构建一个顺序表存放,使在生成轮廓时,轮廓位置变化是有序的),通过高度的变化我们就可以知道轮廓的变化,然后通过位置和最大高度的顺序表构建轮廓数组。

【代码实现】

package AdvancedPromotion3;

import java.util.*;

/**
 * @ProjectName: study3
 * @FileName: Ex1
 * @author:HWJ
 * @Data: 2023/9/18 10:27
 */
public class Ex1 {
    public static void main(String[] args) {
        int[][] matrix = {{2, 5, 6}, {1, 7, 4}, {4, 6, 7}, {3, 6, 5}, {10, 13, 2}, {9, 11, 3}, {12, 14, 4}, {10, 12, 5}};
        List<List<Integer>> ans = getContourMatrix(matrix);
        for (List<Integer> integers : ans) {
            for (int i : integers) {
                System.out.print(i + " ");
            }
            System.out.println();
        }

    }

    public static class Node {
        int x;
        boolean isAdd; // true 表示当前为一个楼的开始, false表示当前地点为一个楼的结束
        int height;

        public Node(int x, boolean isAdd, int height) {
            this.x = x;
            this.isAdd = isAdd;
            this.height = height;
        }


    }

    public static class NodeComparator implements Comparator<Node> {

        @Override
        public int compare(Node o1, Node o2) {
            if (o1.x != o2.x) {
                return o1.x - o2.x;
            }
            if (o1.isAdd != o2.isAdd) {
                return o1.isAdd ? -1 : 1;
            }
            return 0;
        }
    }

    public static List<List<Integer>> getContourMatrix(int[][] matrix) {
        Node[] nodes = new Node[matrix.length * 2];
        for (int i = 0; i < matrix.length; i++) {
            nodes[i * 2] = new Node(matrix[i][0], true, matrix[i][2]);
            nodes[i * 2 + 1] = new Node(matrix[i][1], false, matrix[i][2]);
        }
        Arrays.sort(nodes, new NodeComparator());
        TreeMap<Integer, Integer> heightAndNums = new TreeMap<>();
        TreeMap<Integer, Integer> maxHeight = new TreeMap<>();
        for (Node node : nodes) {
            if (node.isAdd) {
                if (!heightAndNums.containsKey(node.height)) { //如果不存在就新建记录
                    heightAndNums.put(node.height, 1);
                } else {
                    heightAndNums.put(node.height, heightAndNums.get(node.height) + 1);
                }
            } else {
                if (heightAndNums.get(node.height) == 1) { // 如果只剩一条记录了就直接删除
                    heightAndNums.remove(node.height);
                } else {
                    heightAndNums.put(node.height, heightAndNums.get(node.height) - 1);
                }
            }
            if (heightAndNums.isEmpty()) { // 这里通过顺序表记录当前结点的最大高度
                maxHeight.put(node.x, 0);
            } else {
                maxHeight.put(node.x, heightAndNums.lastKey());
            }
        }
        int preHeight = 0;
        int start = 0;
        List<List<Integer>> res = new ArrayList<>();
        for (int x : maxHeight.keySet()) {
            int curHeight = maxHeight.get(x);
            if (preHeight != curHeight) { // 如果高度发生了变化,就构建轮廓
                if (preHeight != 0) { // 如果之前的高度为0, 说明之前的那个地方到现在的地方没有楼
                    res.add(new ArrayList<>(Arrays.asList(start, x, preHeight)));
                }
                preHeight = curHeight;
                start = x;
            }
        }

        return res;
    }
}

【案例2】

【题目描述】

【思路解析】

用滑动窗口解决,如果当前窗口的元素和大于k,l++,小于k,r++,如果==k,记录答案,并且r++。

因为是正数数组,所以滑动窗口在移动过程能维持单调性。保证答案的正确性。

【代码实现】

package AdvancedPromotion3;

/**
 * @ProjectName: study3
 * @FileName: Ex2
 * @author:HWJ
 * @Data: 2023/9/18 11:07
 */
public class Ex2 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,1,1,1,2,1,1,3};
        System.out.println(getMaxLen(arr, 3));
    }

    public static int getMaxLen(int[] arr, int k){
        int l = 0;
        int r = 0;
        int sum = 0;
        int res = -1;
        while (r < arr.length){
            if (sum == k){
                res = Math.max(r - l + 1, res);
                r++;
                if (r == arr.length){
                    break;
                }
                sum += arr[r];
            }
            if (sum > k){
                sum -= arr[l++];
            }
            if (sum < k){
                r++;
                if (r == arr.length){
                    break;
                }
                sum += arr[r];
            }
        }
        return res;
    }
}

【案例3】

【题目描述】

给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k。求arr所有的子数组中累加和等于k的最长子数组长度。

【思路解析】

构建一个哈希表,里面放入前缀和和达到这个前缀和的索引位置。加入k = 5。

哈希表有一个记录为 12,i。表示 0--i、这所有的元素和为12,如果在遍历中有一次前缀和为17,所有为j(j > i),则i+1 --- j的累加和应该为k。记录答案即可。

【代码实现】

package AdvancedPromotion3;

import java.util.HashMap;

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

    }

    public static int getMaxLen(int[] arr, int k){
        if (arr.length == 0){
            return 0;
        }
        HashMap<Integer, Integer> sumIndex = new HashMap<>();
        sumIndex.put(0, -1);
        int res = -1;
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
            if (sumIndex.containsKey(sum - k)){
                res = Math.max(res, i - sumIndex.get(sum - k));
            }
            sumIndex.put(sum, i);
        }
        return res;
    }
}

  

【案例4】

【题目描述】

 【思路解析】

构建两个数组表示,一个数组minSum【i】表示从i开始最远能达到的地方,并且使这个子数组的和最小;minIndex【i】表示从i开始最远能达到的地方的索引。

例如:表格第一行表示无序数组arr,第二行表示minSum,第三行表示minIndex

3-2-406
-3-6-406
33334

得到这个之后就相当于把一个数组分成了几个部分,然后我们通过minIndex可以找到下一个部分的开头,我们只考虑下一次能不能加入下一个部分。

例如

我们在第0位置开始遍历,加入了三个部分,达到了k位置,但是他不能加入下一个部分了,我们便从1开始遍历,看他能不能加入下一个部分。我们默认1-k合法,因为如果他不合法,他一定不能加入下一个部分,所以他的有效大小一定小于0-k,我们需要求最大有效长度,所以它一定不是有效解,所以我们直接默认他为合法,只有他能加入下一个区域,我们才把他作为答案的可能,这样可以舍弃很多无效可能性,降低算法复杂度。

【代码实现】

package AdvancedPromotion3;

/**
 * @ProjectName: study3
 * @FileName: Ex4
 * @author:HWJ
 * @Data: 2023/9/18 12:10
 */
public class Ex4 {
    public static void main(String[] args) {
        int[] arr = {3,-2,-4,0,6};
        System.out.println(getMaxLen(arr, -2));
    }

    public static int getMaxLen(int[] arr, int k){
        int n = arr.length;
        int[] minSub = new int[n];
        int[] minIndex = new int[n];
        minSub[n - 1] = arr[n - 1];
        minIndex[n - 1] = arr[n - 1];
        for (int i = n - 2; i >= 0; i--) {
            if (minSub[i + 1] <= 0){
                minSub[i] = arr[i] + minSub[i + 1];
                minIndex[i] = minIndex[i + 1];
            }else {
                minSub[i] = arr[i];
                minIndex[i] = i;
            }
        }
        int res = 0;
        int p = 0;
        int sum = 0;
        boolean loop =true; // 使第一次进入求解答案时,能正确进入循环
        for (int i = 0; i < n; i++) {
           while (p < n && (loop || sum <= k)){ // 这里不初始化p 和 sum,这样可以舍弃大量不是最优解的解。
               res = Math.max(res, p - i);
               sum += minSub[p];
               p = minIndex[p] + 1;
               loop = false;
           }
           sum -= arr[i];
        }
        return res;
    }
}

 

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

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

相关文章

vue-cli init vue3

安装 cli npm i -g vue/cli4.5.13查看版本&#xff1a;vue -V升级版本&#xff1a;npm update -g vue/cli 初始化项目 vue create 项目名称 > - ? Please pick a preset:Default ([Vue 2] babel, eslint)Default (Vue 3) ([Vue 3] babel, eslint) > Manually selec…

什么是HTML5中的Web存储API,包括LocalStorage和SessionStorage?它们的区别是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Web存储API和区别⭐ LocalStorage&#xff08;本地存储&#xff09;⭐ SessionStorage&#xff08;会话存储&#xff09;⭐ 区别⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff0…

HTTP状态码301(永久重定向)不同Web服务器的配置方法

文章目录 301状态码通常在那些情况下使用301永久重定向配置Nginx配置301永久重定向Windows配置IIS301永久重定向PHP下的301重定向Apache服务器实现301重定向 301重定向是否违反相关法规&#xff1f;推荐阅读 当用户或搜索引擎向服务器发出浏览请求时&#xff0c;服务器返回的HT…

腾讯轻联:带你创造属于自己的AI小助手

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;参加腾讯全球数字生态大会&#xff0c;了解到腾讯轻联企业…

LLM(一)| 百川智能baichuan7B、13B、53B以及baichuan2总结

之前在文章baichuan-53B VS ChatGLM-6B对比中做过百川大模型53B和ChatGLM 6B模型的效果对比&#xff0c;由于百川大模型的内测模型是53B&#xff0c;因此本次对比参数量差异较大&#xff0c;但仍然可以看到两个模型的效果。百川大模型在benchmark上有超越ChatGLM和LLaMA的迹象&…

《DevOps实践指南》- 读书笔记(六)

DevOps实践指南 Part 4 第二步 &#xff1a;反馈的技术实践17. 将假设驱动的开发和A/B测试融入日常工作17.1 A/B 测试简史17.2 在功能测试中集成 A/B 测试17.3 在发布中集成 A/B 测试17.4 在功能规划中集成 A/B 测试17.5 小结 18. 建立评审和协作流程以提升当前工作的质量18.1 …

内存映射-

内存映射区不会堵塞 父子进程之间通信 /*#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);作用&#xff1a;将一个文件或者设备的数据映射到内存中参数&#xff1a;- addr&#xff1a;NULL- length&#xff1…

计算机毕设 flink大数据淘宝用户行为数据实时分析与可视化

文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计&#xff1a;每小时成交量2.2.1 创建 es 结果表&#xff0c; 存放每小时的成交量2.2.2 执行 sql &#x…

双喜临门 | 开源网安SFuzz在谷歌FuzzBench中夺魁,并获得CWE国际认证

​近日&#xff0c;开源网安模糊测试平台SFuzz于上半年推出的“灰盒代码模糊测试系统”&#xff0c;经过数月的不断调优&#xff0c;在谷歌的FuzzBench基准测试中脱颖而出&#xff0c;荣登榜首。此外&#xff0c;SFuzz还成功获得了CWE国际兼容性认证&#xff0c;进一步巩固了其…

警报:新的 Kubernetes 漏洞可对 Windows 端点实施远程攻击

不久前&#xff0c;研究人员在 Kubernetes 中发现的三个可被利用并相互关联的高危安全漏洞&#xff0c;这些漏洞可在集群内的 Windows 端点上以提升权限的方式实现远程代码执行。 这些漏洞被标记为 CVE-2023-3676、CVE-2023-3893 和 CVE-2023-3955&#xff0c;CVSS 评分为 8.8…

第73步 时间序列建模实战:多步滚动预测 vol-1(以决策树回归为例)

基于WIN10的64位系统演示 一、写在前面 上一期&#xff0c;我们讲了单步滚动预测&#xff0c;一次只预测一个值。 既然有单步&#xff0c;有没有多步呢&#xff1f;那肯定有&#xff0c;这一期来介绍多步滚动预测。 然而&#xff0c;多步滚动模型也可以有不同的步骤&#x…

Mac电脑运行太卡怎么办?

许多小伙伴使用Mac后都反馈电脑不如想象中的流畅&#xff0c;甚至有点卡顿的现象&#xff0c;原因可能是因为无用的应用占据了过多的内存&#xff0c;或者是系统盘垃圾过多&#xff0c;导致的电脑卡顿现象。 今天小编教给大家几招&#xff0c;让自己的Mac能够一键重生&#xf…

创造性地解决冲突

1、冲突的根本原因是矛盾双方存在不可调和的目标冲突。 2、要知己知彼&#xff1a; 知己&#xff1a;就是对自己的问题、需求进行客观定义&#xff0c;说明需求和问题的意义或价值、阐述解决方案和期望效果&#xff1b; 知彼&#xff1a;站在对方立场&#xff0c;深挖对方真…

探索AIGC人工智能(Midjourney篇)(四)

文章目录 Midjourney模特换装 Midjourney制作APP图标 Midjourney网页设计 Midjourney如何生成IP盲盒 Midjourney设计儿童节海报 Midjourney制作商用矢量插画 Midjourney设计徽章 Midjourney图片融合 Midjourney后缀参数 Midjourney模特换装 关键词生成模特照片 中国女性模特的…

虚拟机Ubuntu操作系统常用终端命令(3)(详细解释+详细演示)

本篇概要 本篇讲述了Ubuntu操作系统常用的几个功能&#xff0c;即修改文件权限、修改文件属性、可执行脚本、虚拟机网络、FTP服务器、SSH服务器、VIM等方面的知识。希望能够得到大家的支持。 文章目录 本篇概要1.修改文件权限2.修改文件属主3.可执行脚本3.1要点与细节3.2shell…

河北吉力宝打造步力宝智能康养鞋,助力健康中国行

据国家统计局数据&#xff0c;2022年我国总人口减少85万人&#xff0c;正式迈入人口负增长时代。人口老龄化程度的进一步加深令劳动力愈加不足&#xff0c;加之“421”的家庭结构&#xff0c;仅依靠政府性养老事业已难以支撑。 当老年群体对品质消费越来越看重时&#xff0c;康…

9万多条执业医师资格考试题库ACCESS数据库

《9万多条执业医师资格考试题库ACCESS数据库》搜集了大量执业医师资格考试试题&#xff0c;包括临床执业医师资格考试试题、口腔执业医师资格考试试题、中医执业医师资格考试试题、中西医结合执业医师资格考试试题、公卫执业医师资格考试试题等。 分类情况包含&#xff1a;临床…

MT4深受投资者喜欢,anzo capital昂首资本认为这几个特点必不可少

MT4为什么深受投资者喜欢&#xff0c;anzo capital昂首资本总结这几个特点&#xff0c;一起分享给各位投资者。 一.专业性 MT4平台是专门为外汇投资交易而设计的。投资者可以在指数、股票、债券、商品和各种货币上交易货币和差价合约。 二.兼容性 MT4不仅可用于32位操作系统…

对于每种情况分别统计概率来计算期望+树上连通块统计:ARC165E

https://atcoder.jp/contests/arc165/tasks/arc165_e 考虑一个常见套路&#xff0c;我们对每个连通块统计其概率&#xff0c;设为 p ( T ) p(T) p(T)&#xff0c;则答案为 ∑ ∣ T ∣ > k p ( T ) \sum_{|T|>k} p(T) ∣T∣>k∑​p(T) 可以想成对于每个大小大于 k …

RockyLinux安装MariaDB

文章目录 1 前言2 参考3 开始安装3.1 运行官方脚本 添加 MariaDB 的源3.2 安装 MariaDB Server3.3 启动 MariaDB 4 SSH 登录 MariaDB4.1 ssh 上使用 root 账号登录4.2 新建管理员账号并授权 5 放行端口 33065.1 VirtualBox 上设置端口转发5.2 Rocky Linux 防火墙放行 3306 端口…