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

news2024/12/19 15:15:23

前言

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

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

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

相关文章

手写分布式配置中心(二)实现分布式配置中心的简单版本

这一篇文章比较简单&#xff0c;就是一个增删改查的服务端和一个获取配置的客户端&#xff0c;旨在搭建一个简单的配置中心架构&#xff0c;代码在 https://gitee.com/summer-cat001/config-center 服务端 服务端选择用springboot 2.7.14搭建&#xff0c;设计了4个接口/confi…

每天一道leetcode:20.有效的括号(简单;栈的经典题目)

⭐今日份题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对…

【数据结构与算法设计】上机课习题一

基础知识 勾画 1.存储结构是逻辑结构的&#xff08;&#xff09;实现 2.一个算法的时空性能是指该算法的&#xff08;&#xff09;和&#xff08;&#xff09; 3.在一般算法下一个算法的事件复杂性是&#xff08;&#xff09;的函数 4.用python设计一个算法&#xff0c;计算 …

输入文章id,爬取小红书某文章下所有评论

import requests import time import csvf open(小红书评论.csv,mode a,encodingutf-8,newline) csv_writer csv.DictWriter(f,fieldnames[内容,点赞数量,发布时间,昵称,头像链接,用户id]) csv_writer.writeheader()def spider(url):headers {"Cookie":"abR…

程序员竟然还有职业规划手册?

《程序员职业规划手册》不是一本具体的书&#xff0c;而是由前阿里技术总监雪梅老师讲授的一个专栏课程&#xff0c;总共有20讲&#xff0c;内容基本都是图片和文字形式&#xff0c;也有对应的语音讲述。 回顾了下毕业工作的这几年&#xff0c;我买过很多学习课程&#xff0c;…

【Python】进阶学习:pandas--read_csv()用法详解

&#x1f680;【Python】进阶学习&#xff1a;pandas–read_csv()用法详解&#x1f680; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教…

Windows服务器:通过nginx反向代理配置HTTPS、安装SSL证书

先看下效果&#xff1a; 原来的是 http&#xff0c;配置好后 https 也能用了&#xff0c;并且显示为安全链接。 首先需要 SSL证书 。 SSL 证书是跟域名绑定的&#xff0c;还有有效期。 windows 下双击可以查看相关信息。 下载的证书是分 Apache、IIS、Tomcat 和 Nginx 的。 我…

redis批量删除指定前缀key四种方法(收藏)

这篇文章主要介绍了redis批量删除指定前缀key四种方法。 目录 redis批量删除指定前缀key四种方法 第一种&#xff1a;第二种&#xff1a;第三种&#xff1a;第四种&#xff1a;Redis 如何批量删除指定前缀的Key 编码方式 redis批量删除指定前缀key四种方法 第一种&#xff…

【题解】—— LeetCode一周小结9

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结8 26.二叉搜索树的范围和 题目链接&#xff1a;938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输…

SpringBoot-yaml语法

1.概念 在Springboot的项目中&#xff0c;配置文件有以下几种格式&#xff1a; Application.propertiesApplication.yamlApplication.yml 其中官方推荐我们使用yaml的格式(因为能表示的数据类型很多样) 2.基本语法 # yaml形式的配置文件# 普通的key-value&#xff08;分号之后…

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

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

MyBatis操作数据库(XML方式)

MyBatis是一个持久层框架&#xff0c;和Spring没有任何关系&#xff0c;可以用来简化数据库的操作&#xff01; 创建工作&#xff1a; 创建Spring Boot工程&#xff0c;并导入MyBatis的起步依赖&#xff0c;Mysql的依赖等 配置数据 #配置数据库的连接字符串 spring:datasour…

ruoyi 图片等文件资源读取

老是忘&#xff0c;记录一下 ResourcesConfig 文件下 /** 本地文件上传路径 */ registry.addResourceHandler(Constants.RESOURCE_PREFIX "/**").addResourceLocations("file:" RuoYiConfig.getProfile() "/"); /*** 资源映射路径 前缀*/ …

C++使用工具进阶(LOG输出、堆栈跟踪、代码结构、code review)

0. 简介 对于C&#xff0c;无论是大学生还是算法工程师都是非常需要学习并使用的一门语言&#xff0c;而C不像python、rust一样简单好用。不单单是在嵌套复杂代码后的逻辑还是各种类和堆栈的管理&#xff0c;都是非常头疼的问题。一般来说对于LOG类很多都是使用GLOG、而堆栈跟…

STM32 (1)

1.基本信息 stm32是由ST公司生产的一种32位微控制器&#xff08;单片机&#xff09;。 1.1 各种型号 stm32是32位单片机的总称&#xff0c;有多种不同的系列。 32即用32个比特位表示一个地址&#xff0c;寻址范围&#xff1a;0x00000000 --0xffffffff (4GB) 1.2 存储密度 …

本地如何配置支付宝模拟支付场景并结合内网穿透实现公网环境调试开发?

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙箱环境…

[环境配置]ssh连接报错“kex_exchange_identification: read: Connection reset by peer”

已经被VScode ssh毒死好几次了&#xff0c;都是执行命令意外中断&#xff0c;然后又VSCode里连不上、本机Terminal也连不上了。。。 重启远程服务器&#xff0c;VSCode可以连上了&#xff0c; 系统ssh还是不行&#xff0c;报错“kex_exchange_identification: read: Connecti…

数字化转型对企业有什么意义

降本增效&#xff0c;提高生产力 数字化转型可以引入自动化和智能化技术、帮助企业优化流程、减少人工操作和错误&#xff0c;提高工作效率和生产力。例如&#xff0c;使用机器人流程自动化 (RPA) 可以自动执行重复性任务&#xff0c;使员工能够专注于更具价值的工作。除了通过…

YOLOv5独家原创改进:特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合YOLOv5,实现涨点。 将GELAN添加在backbone和head处,提供多个yaml改进方法 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现…

5.测试教程 - 进阶篇

文章目录 1.按测试对像划分1.1**界面测试**1.2**可靠性测试**1.3**容错性测试**1.4**文档测试**1.5**兼容性测试**1.6**易用性测试**1.7**安装卸载测试**1.8**安全测试**1.9**性能测试**1.10**内存泄漏测试** 2.按是否查看代码划分2.1黑盒测试(Black-box Testing)2.2白盒测试(W…