Leetcode - 周赛387

目录

一,3069. 将元素分配到两个数组中 I

二,3070. 元素和小于等于 k 的子矩阵的数目

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

四,3072. 将元素分配到两个数组中 II


一,3069. 将元素分配到两个数组中 I

 本题数据范围较小,纯模拟,代码如下:

class Solution {
    public int[] resultArray(int[] nums) {
        int n = nums.length;
        List<Integer> a = new ArrayList<>();
        List<Integer> b = new ArrayList<>();
        a.add(nums[0]);
        b.add(nums[1]);
        for(int i=2; i<n; i++){
            int t = a.get(a.size()-1) - b.get(b.size()-1);
            if(t > 0)
                a.add(nums[i]);
            else
                b.add(nums[i]);
        }
        a.addAll(b);
        for(int i=0; i<n; i++){
            nums[i] = a.get(i);
        }
        return nums;
    }
}

二,3070. 元素和小于等于 k 的子矩阵的数目

本题的主要考点在于求二维数组的前缀和,这里有两种写法:

1)递推

class Solution {
    public int countSubmatrices(int[][] grid, int k) {
        int n = grid.length;
        int m = grid[0].length;
        int ans = 0;
        int[][] f = new int[n+1][m+1];//这样初始化是防止f[i][j]中的i,j出现负数的情况
        for(int i=0; i<n; i++){ 
            for(int j=0; j<m; j++){
                f[i+1][j+1] = f[i][j+1] + f[i+1][j] - f[i][j] + grid[i][j];
                if(f[i+1][j+1]<=k)
                    ans++;
            }
        }
        return ans;
    }
}

2)由一维前缀和推导而来,本质还是递推

 先用一个数组计算每一行的前缀和,再用一个数组来统计前 i 行 j 列的元素和

class Solution {
    public int countSubmatrices(int[][] grid, int k) {
        int n = grid.length;
        int m = grid[0].length;
        int ans = 0;
        int[] sum = new int[m];//第i行的前缀和
        int[] pre_sum = new int[m];//前 i 行 前 j 列的元素前缀和
        for(int i=0; i<n; i++){ 
            for(int j=0; j<m; j++){
                sum[j] = (j>0?sum[j-1]:0) + grid[i][j];
                pre_sum[j] += sum[j];
                if(pre_sum[j]<=k){
                    ans++;
                } 
            }
        }
        return ans;
    }
}

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

 数据范围小,纯模拟题,代码如下:

class Solution {
    //正难则反
    //求最少操作次数 -> 总数 - 最大的不操作次数
    public int minimumOperationsToWriteY(int[][] grid) {
        int[] left = new int[3];统计剩下的形状中0,1,2各出现的次数
        int[] y = new int[3];//统计y形状中0,1,2各出现的次数
        int n = grid.length;
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(i<=n/2&&(i==j||i==n-j-1)||i>n/2&&j==n/2){
                    y[grid[i][j]]++;
                }else{
                    left[grid[i][j]]++;
                }
            }
        }
        int ans = Math.max(y[0]+left[1], y[0]+left[2]);
        ans = Math.max(y[1]+left[0],Math.max(ans, y[1]+left[2]));
        ans = Math.max(y[2]+left[0],Math.max(ans, y[2]+left[1]));
        return n*n-ans;
    }
}

四,3072. 将元素分配到两个数组中 II

 

本题需要维护一个动态的前缀和,如果使用一个链表,那么他的查找和添加操作需要O(n)的时间,再加上遍历nums所需要的O(n)时间,也就是说需要O(n^2)的时间复杂度,这肯定会超时,所以这里使用了树状数组的数据结构。

在讲思路之前,先简单介绍一下树状数组:树状数组是解决数据压缩里的累积频率的计算问题,多用于高效计算数列的前缀和, 区间和。

画个图了解一下:

思路:创建两个树状数组,通过当前树状数组的前缀和来统计有多少数小于当前遍历的nums[i],同时把nuns[i]添加进其中满足题目条件的树状数组中,为了减少空间复杂度,还可以使用离散化,因为题目中只要求比较大小,比如说:5 和 10 比较大小, 与 1 和 2 比较大小的结果并无区别,也就是说将 5 和 10 替换成 1 和 2 对题目也没有影响,因此可以将nums排序,再使用下标代替原本的值(注意,树状数组的下标是从1开始的,所以要统一加一)。

代码如下:

class Solution {
    static class Fenwick{//树状数组
        int[] tree;
        public Fenwick(int n){
            tree = new int[n];
        }
        public void add(int i){
            while(i < tree.length){
                tree[i]++;
                i += i & -i;
            }
        }
        public int pre(int i){
            int res = 0;
            while(i > 0){
                res += tree[i];
                i &= i-1;
            }
            return res;
        }
    }
    public int[] resultArray(int[] nums) {
        int n = nums.length;
        List<Integer> a = new ArrayList<>();
        List<Integer> b = new ArrayList<>();
        Fenwick a1 = new Fenwick(n+1);
        Fenwick b1 = new Fenwick(n+1);
        a.add(nums[0]);
        b.add(nums[1]);
        int[] tmp = nums.clone();
        Arrays.sort(tmp);
        a1.add(binarySearch(tmp, nums[0])+1);
        b1.add(binarySearch(tmp, nums[1])+1);

        for(int i=2; i<n; i++){
            int x = nums[i];
            int v = binarySearch(tmp, x)+1;
            int a2 = a.size() - a1.pre(v);
            int b2 = b.size() - b1.pre(v);
            if(a2>b2 || a2==b2&&a.size()<=b.size()){
                a.add(x);
                a1.add(v);
            }else{
                b.add(x);
                b1.add(v);
            }
        }
        a.addAll(b);
        for(int i=0; i<n; i++)
            nums[i] = a.get(i);
        return nums;
    }
    int binarySearch(int[] arr, int tar){//二分查找+离散化
        int l = 0;
        int r = arr.length-1;
        while(l <= r){
            int mid = l+(r-l)/2;
            if(arr[mid]>tar){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return l-1;
    }
}

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

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

相关文章

[递归、搜索、回溯]----递归

前言 作者&#xff1a;小蜗牛向前冲 专栏&#xff1a;小蜗牛算法之路 专栏介绍&#xff1a;"蜗牛之道&#xff0c;攀登大厂高峰&#xff0c;让我们携手学习算法。在这个专栏中&#xff0c;将涵盖动态规划、贪心算法、回溯等高阶技巧&#xff0c;不定期为你奉上基础数据结构…

freeRTOS20240308

1.总结任务的调度算法&#xff0c;把实现代码再写一下 2.总结任务的状态以及是怎么样进行转换的

音视频学习笔记——c++多线程(一)

✊✊✊&#x1f308;大家好&#xff01;本篇文章主要整理了部分多线程相关的内容重点&#x1f607;。首先讲解了多进程和多线程并发的区别以及各自优缺点&#xff0c;之后讲解了Thead线程库的基本使用。 本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统…

react的diff源码

react 的 render 阶段&#xff0c;其中 begin 时会调用 reconcileChildren 函数&#xff0c; reconcileChildren 中做的事情就是 react 知名的 diff 过程 diff 算法介绍 react 的每次更新&#xff0c;都会将新的 ReactElement 内容与旧的 fiber 树作对比&#xff0c;比较出它们…

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

官方网址 源码&#xff1a;https://kafka.apache.org/downloads 快速开始&#xff1a;https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程&#xff1a;主线程只负责组织消息&#xff0c;如果是同步发送会阻塞&#xff0c;如果是异…

【CSP试题回顾】202104-2-邻域均值

CSP-202104-2-邻域均值 关键点&#xff1a;二维差分数组 详见&#xff1a;【CSP考点回顾】差分数组 解题思路 初始化矩阵和参数&#xff1a;首先&#xff0c;代码接收矩阵的大小&#xff08;n x n&#xff09;&#xff0c;每个元素的亮度值&#xff08;位于[0, L]区间&…

基于Vue的体育汇App设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 核心技术的理论与分析 3 1.1 客户端技术 3 1.1.1 Vue.js框架 3 1.1.2 Vue.js路由管理 3 1.1.3 Vuex状态管理 3 1.1.4 MVVM开发模式 4 1.1.5 Vant组件库 5 1.2 服务端技术 5 1.2.1 Node.js 5 1.2.2 Egg.js框架 5 1.3 数据库技术 6 1.4 本章…

webUI自动化测试框架

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【LeetCode】升级打怪之路 Day 16:二叉树题型 —— 二叉树的构造

今日题目&#xff1a; 654. 最大二叉树105. 从前序与中序遍历序列构造二叉树106. 从中序与后序遍历序列构造二叉树889. 根据前序和后序遍历构造二叉树 目录 LC 654. 最大二叉树 【easy】 Problem&#xff1a;根据遍历序列来还原二叉树 【classic】 ⭐⭐⭐⭐⭐LC 105. 从前序与中…

数据库原理实验课(1)

目录 实验内容 安装头歌中的相关内容 具体过程 完结撒花~ 我也是第一次接触oracle的相关软件和操作&#xff0c;所以是一次傻瓜式教学记录 实验内容 安装头歌中的相关内容 具体过程 这是我在百度网盘中下载解压出来的oracle文件夹内的全部内容&#xff08;可能有因为安装完…

使用Portainer让测试环境搭建飞起来

Docker的用处不多加赘述&#xff0c;Docker目前有以下应用场景&#xff1a; 测试&#xff1a;Docker很适合用于测试发布&#xff0c;将 Docker 封装后可以直接提供给测试人员进行运行&#xff0c;不再需要测试人员与运维、开发进行配合&#xff0c;进行环境搭建与部署。 测试…

【技术】基于Github Pages搭建个人博客静态网页

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 文章目录 一、技术基础二、新建特殊仓库三、上传网页文件四、Github Pages设置 个人网页作为仅服务个人的网页&#xff0c;一…

Grafana变量默认全选

注&#xff1a;本文基于Grafana v9.2.8编写 1 问题 EKS集群里的node按照不同label被分为几类&#xff0c;我需要对这几类的node做一些统计。我希望当我使用lable选择时&#xff0c;node的值自动设置为该lable的所有node集合&#xff0c;而不需要再手动全选。 2 解决方案 变…

微信小程序(五十四)腾讯位置服务示范(2024/3/8更新)

教程如下&#xff1a; 上一篇 1.先在官网注册一下账号&#xff08;该绑定的都绑定一下&#xff09; 腾讯位置服务官网 2.进入控制台 3.创建应用 3. 额度分配 4.下载微信小程序SDK 微信小程序SDK下载渠道 5.解压将俩js文件放在项目合适的地方 6.加入安全域名or设置不验证合…

扩展CArray类,增加Contain函数

CArray不包含查找类的函数&#xff0c;使用不便。考虑扩展CArray类&#xff0c;增加Contain函数&#xff0c;通过回调函数暴露数组元素的比较方法&#xff0c;由外部定义。该方法相对重载数组元素的“”符号更加灵活&#xff0c;可以根据需要配置不同的回调函数进行比较 //类型…

AD20中关于“failed to add class member”的解决方法

目录 问题描述&#xff1a; 解决方法&#xff1a; 1.切换至PCB界面-选择工具栏的设计-类 2.把Component classes中的所有的类全部按照图中删除&#xff0c;保存 3.重新返回原理图界面转换PCB即可成功 问题描述&#xff1a; failed to add class member&#xff1a;未能添加…

解答关于:水牛社软件是做什么的?水牛社软件靠谱么?

很多对我们软件感兴趣但是没有入手的观望者都会有这样的疑问&#xff1a;水牛社软件具体是做什么的&#xff1f;水牛社软件靠谱么&#xff1f; 其实软件的简介已经讲的很清楚了&#xff0c;但是软件不是功能性软件&#xff0c;所以不能给大家免费试用&#xff0c;短期任务版块…

智能驾驶规划控制理论学习08-自动驾驶控制模块(轨迹跟踪)

目录 一、基于几何的轨迹跟踪方法 1、基本思想 2、纯追踪 3、Stanly Method 二、PID控制器 三、LQR&#xff08;Linear Quadratic Regulator&#xff09; 1、基本思想 2、LQR解法 3、案例学习 基于LQR的路径跟踪 基于LQR的速度跟踪 4、MPC&#xff08;Mode…

Python通过SFTP实现网络设备配置备份

一、背景 为了防止网络设备意外损坏&#xff0c;导致配置文件无法恢复&#xff0c;可以通过将网络设备的配置文件备份到本地电脑上。 一般情况下&#xff0c;设备支持通过FTP、TFTP、FTPS、SFTP和SCP备份配置文件。其中使用FTP和TFTP备份配置文件比较简单&#xff0c;但是存在…

JAVA虚拟机实战篇之内存调优[4](内存溢出问题案例)

文章目录 版权声明修复问题内存溢出问题分类 分页查询文章接口的内存溢出问题背景解决思路问题根源解决思路 Mybatis导致的内存溢出问题背景问题根源解决思路 导出大文件内存溢出问题背景问题根源解决思路 ThreadLocal占用大量内存问题背景问题根源解决思路 文章内容审核接口的…