力扣 第 387 场周赛 解题报告 | 珂学家 | 离散化树状数组 + 模拟场


前言

image.png


整体评价

手速场+模拟场,思路和解法都蛮直接的。

所以搞点活

  • 如果T2,如果不固定左上角,批量查询某个点为左上角,求满足总和 ≤ k \le k k的子矩阵个数

  • 如果T2,如果不固定左上角,求总和 ≤ k \le k k的子矩阵个数

  • 如果T3, 数值不局限于0,1,2, 求最小操作数


A. 将元素分配到两个数组中 I

思路: 模拟

模拟即可,没啥可说的。

class Solution {
    public int[] resultArray(int[] nums) {
        List<Integer> r1 = new ArrayList<>(List.of(nums[0]));
        List<Integer> r2 = new ArrayList<>(List.of(nums[1]));

        for (int i = 2; i < nums.length; i++) {
            if (r1.get(r1.size() - 1) > r2.get(r2.size() - 1)) {
                r1.add(nums[i]);
            } else {
                r2.add(nums[i]);
            }
        }
        
        r1.addAll(r2);
        return r1.stream().mapToInt(Integer::valueOf).toArray();
    }
}

B. 元素和小于等于 k 的子矩阵的数目

思路: 二维前缀和 + 枚举

因为固定左上角,所以子矩阵的个数为 n ∗ m n * m nm

前缀和预处理, O ( n ∗ m ) O(n * m) O(nm)

枚举子矩阵为, O ( n ∗ m ) O(n * m) O(nm)

class Solution {
    public int countSubmatrices(int[][] grid, int k) {
        int h = grid.length, w = grid[0].length;
        long[][] pre = new long[h + 1][w + 1];
        
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                pre[i + 1][j + 1] = pre[i + 1][j] + pre[i][j + 1] - pre[i][j] + grid[i][j];
            }
        }
        
        int res = 0;
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                if (pre[i + 1][j + 1] <= k) {
                    res ++;
                }
            }
        }
        
        return res;
    }
}

思考:

如果左上角并不固定,而且以任意点出发,求满足要求的子矩阵数? 而且这个查询量不小?

那面对这个问题,该如何求解呢?

感觉一次查询,可以从 O ( n ∗ m ) 优化为 O ( n + m ) O(n * m) 优化为 O(n+m) O(nm)优化为O(n+m),就是从右上点出发,逐渐收敛到左下。


C. 在矩阵上写出字母 Y 所需的最少操作次数

思路: 模拟 + 枚举组合

唯一可以增加难度的是,不限定数值范围

不过这也才基本的nlargest问题

class Solution {

    boolean isJudge(int y, int x, int n) {
        if (y == x && y <= n / 2) {
            return true;
        }
        if (y + x == n - 1 && y <= n / 2) {
            return true;
        }
        if (y >= n / 2 && x == n / 2) {
            return true;
        }
        return false;
    }

    public int minimumOperationsToWriteY(int[][] grid) {
        int n = grid.length;
        int[] ys = new int[3];
        int[] nys = new int[3];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int id = grid[i][j];
                if (isJudge(i, j, n)) {
                    ys[id]++;
                } else {
                    nys[id]++;
                }
            }
        }

        // 枚举即可
        int res = n * n;
        int totYs = n/2 + n/2 + n/2 + 1;
        int totNys = n * n - totYs;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (i != j) {
                    res = Math.min(res, (totYs - ys[i]) + (totNys - nys[j]));
                }
            }
        }

        return res;
    }

}

D. 将元素分配到两个数组中 II

思路:离散化 + 树状数组

板子题,而且非常的直接

class Solution {

    static class BIT {
        int n;
        int[] arr;
        public BIT(int n) {
            this.n =n;
            this.arr = new int[n + 1];
        }
        int query(int p) {
            int res = 0;
            while (p > 0) {
                res += arr[p];
                p -= p & -p;
            }
            return res;
        }
        void update(int p, int d) {
            while (p <= n) {
                arr[p] += d;
                p += p & -p;
            }
        }
    }

    public int[] resultArray(int[] nums) {
        List<Integer> arr1 = new ArrayList<>(List.of(nums[0]));
        List<Integer> arr2 = new ArrayList<>(List.of(nums[1]));
        
        // 离散化过程
        TreeSet<Integer> ts = new TreeSet<>();
        for (int v: nums) ts.add(v);
        int ptr = 1;
        Map<Integer, Integer> idMap = new HashMap<>();
        for (var k: ts) {
            idMap.put(k, ptr++);
        }

        // 树状数组模拟过程
        BIT bit1 = new BIT(ptr);
        BIT bit2 = new BIT(ptr);

        bit1.update(idMap.get(nums[0]), 1);
        bit2.update(idMap.get(nums[1]), 1);
        for (int i = 2; i < nums.length; i++) {
            int v = nums[i];
            Integer k = idMap.get(v);

            int cnt1 = bit1.query(ptr) - bit1.query(k);
            int cnt2 = bit2.query(ptr) - bit2.query(k);
            if (cnt1 > cnt2 || (cnt1 == cnt2 && arr2.size() >= arr1.size())) {
                arr1.add(v);
                bit1.update(k, 1);
            } else {
                arr2.add(v);
                bit2.update(k, 1);
            } 
        }
        
        arr1.addAll(arr2);
        return arr1.stream().mapToInt(Integer::valueOf).toArray();
    }
}

写在最后

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20款Visual Studio实用插件推荐

前言 俗话说的好工欲善其事必先利其器&#xff0c;安装一些实用的Visual Studio插件对自己日常的开发和工作效率能够大大的提升&#xff0c;避免996从选一款好的IDE实用插件开始。以下是我认为比较实用的Visual Studio插件&#xff0c;希望对大家有所帮助。 各位小伙伴有更好的…

Redis安全加固策略:绑定Redis监听的IP地址 修改默认端口 禁用或者重命名高危命令

Redis安全加固策略&#xff1a;绑定Redis监听的IP地址 & 修改默认端口 & 禁用或者重命名高危命令 1.1 绑定Redis监听的IP地址1.2 修改默认端口1.3 禁用或者重命名高危命令1.4 附&#xff1a;redis配置文件详解&#xff08;来源于网络&#xff09; &#x1f496;The Beg…

[HGAME 2024 WEEK3] Misc 与ai聊天

[HGAME 2024 WEEK3] Misc 与ai聊天 题目描述&#xff1a;跟他聊一聊吧&#xff0c;从他嘴里翘出flag 开题&#xff0c;这种一般是提示词注入漏洞。简而言之就是骗。 失败的案例 成功的案例

论文阅读:基于超像素的图卷积语义分割(图结构数据)

#Superpixel-based Graph Convolutional Network for Semantic Segmentation github链接 引言 GNN模型根据节点特征周围的边来训练节点特征&#xff0c;并获得最终的节点嵌入。通过利用具有不同滤波核的二维卷积对来自附近节点的信息进行整合&#xff0c;给定超像素方法生成的…

基于hyperleger fabric区块链的校园化妆品交易平台搭建(完整源码+详细文档+解析讲解)

基于hyperleger fabric区块链的校园化妆品交易平台搭建 源码资料等获取方式在文章末尾 一、大数据与区块链解决方案概述 选题背景: 目前不少同学在校园里进行二手交易没有一个大众认可的平台&#xff0c;很多都是私下交易&#xff0c;但会存在很多虚假交易&#xff0c;甚至出…

代码随想录算法训练营第八天

344. 反转字符串 方法&#xff1a; 方法一&#xff1a; 直接用reverse函数 注意&#xff1a; 代码&#xff1a; class Solution { public:void reverseString(vector<char>& s) {return reverse(s.begin(), s.end());} };运行结果&#xff1a; 方法&#xff1…

学习408之数据结构--线性表-顺序表 学会动态顺序表的创建

线性表 线性表(inear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串等 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。但是在物理结构上并不一定…

视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet

视频生成模型Sora的全面解析&#xff1a;从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet 真没想到&#xff0c;举例视频生成上一轮的集中爆发才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了自打2.16日OpenAI发布sora以来&#xff0c;不但把同时…

论文阅读_代码生成模型_CodeGeeX

英文名称: CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X 中文名称: CodeGeeX&#xff1a;一种用于代码生成的预训练模型&#xff0c;并在HumanEval-X上进行多语言评估 链接: https://arxiv.org/abs/2303.17568 代码: http…

政务浏览器——打通信创闭环最后一公里

当前&#xff0c;信创建设工作主要集中在芯片、操作系统、数据库以及pc整机&#xff0c;这些领域基本可用&#xff0c;或者达到了市场主流水平。但是&#xff0c;政务办事场景下的信创落地仍然困难重重&#xff0c;很多地方不得不装双系统或买两台设备来来平衡日常业务和信创考…

CentOS部署FastDFS+Nginx并实现远程访问本地服务器中文件

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

盘点全网哪些超乎想象的高科技工具?有哪些免费开源的最新AI智能工具?短视频自媒体运营套装?

盘点全网哪些超乎想象的高科技工具&#xff1f;有哪些免费开源的最新AI智能工具&#xff1f;短视频自媒体运营套装&#xff1f; 自媒体主要用来干什么&#xff1f; 可以通过短视频吸引更多的观众和粉丝&#xff0c;提升自媒体账号的影响力和知名度。 短视频形式更加生动、直观…

MySQL-----视图

一 视图 ▶ 介绍 视图view是一个虚拟表&#xff0c;非真实存在&#xff0c;其本质是根据SQL语句获取动态的数据集&#xff0c;并为其命名&#xff0c;用户使用时只需使用视图名称即可获取结果集&#xff0c;并可以将其当作表来使用。 数据库中存放了视图的定义&…

windows环境下Grafana+loki+promtail入门级部署日志系统,收集Springboot(Slf4j+logback)项目日志

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

HarmonyOS—开启AOT编译模式

AOT&#xff08;Ahead Of Time&#xff09;即提前编译&#xff0c;能够在Host端&#xff08;即运行DevEco Studio的电脑&#xff09;将字节码提前编译成Target端&#xff08;即运行应用的设备&#xff09;可运行的机器码&#xff0c;这样字节码可以获得充分编译优化&#xff0c…

OpenMMlab AI实战营第三期培训

OpenMMlab AI实战营第三期培训 OpenMMlab实战营第三次课2023.2.2学习参考一、pytorch完整训练过程二、基于mmclassification做图像分类1.安装mim工具包以及必备的库2. OpenMMlab项目中的重要概念&#xff08;1&#xff09;配置文件&#xff08;2&#xff09;下载配置文件 3.训练…

Frontend - Boostrap 消息弹窗

目录 一、下载 &#xff08;一&#xff09;中文官网 &#xff08;二&#xff09;bootstrap v3 依赖 jQuery 插件 二、解压并安装 &#xff08;一&#xff09;解压 1. 压缩包解压 2. 简化文件 &#xff08;二&#xff09;安装 三、配置 &#xff08;一&#xff09;bas…

CDN介绍

概念介绍 CDN Content Delivery Network&#xff0c;缩写&#xff1a;CDN&#xff09;是一种提供更快互联网访问的服务&#xff0c;通过在网络的边缘或核心交换区域部署内容代理服务器来实现。这些服务器利用全局负载调度机制来分发内容&#xff0c;从而构建了一个覆盖范围广…

2023年个税申报:“婴幼儿照护专项附加扣除标准”你选对了没有?

2023年个税申报&#xff1a;“婴幼儿照护专项附加扣除标准”你选对了没有&#xff1f; 根据《国务院关于设立3岁以下婴幼儿照护个人所得税专项附加扣除的通知》(国发〔2022〕8号)&#xff1a; 一、纳税人照护3岁以下婴幼儿子女的相关支出&#xff0c;按照每个婴幼儿每月1000元…

技术总结: PPT绘图

目录 写在前面参考文档技巧总结PPT中元素的连接立方体调整厚度调整图形中的文本3D 图片调整渐变中的颜色 写在前面 能绘制好一个好看的示意图非常重要, 在科研和工作中好的示意图能精准表达出自己的想法, 减少沟通的成本, 可视化的呈现也可以加强自身对系统的理解, 时间很久后…