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]);elseb.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;}
}

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

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

相关文章

MySql进阶 锁 优化 | DAY 15

锁 计算机协调多个进程或线程并发访问某一种资源的机制 粒度 全局锁 锁住数据库中所有表表级锁 锁住整张表行级锁 锁住对应行数 全局锁 锁后 只能进行读取 全库的数据备份 从而获取一致性视图 全局锁 flush tables with read lock; 备份 mysqldump -u root -p 12345 dat…

Express学习(三)

Express中间件 中间件的概念 什么是中间件 中间件&#xff0c;特指业务流程的中间处理环节。Express中间件的调用流程 当一个请求到达Express的服务器之后&#xff0c;可以连续调用多个中间件&#xff0c;从而对这次请求进行预处理。类似于下图所示 Express中间件的格式 Expr…

内联函数|auto关键字|范围for的语法|指针空值

文章目录 一、内联函数1.1概念1.2特性 二、auto关键字2.2类型别名思考2.3auto简介2.4auto使用细则2.4 auto不能推导的场景 三、基于范围的for循环(C11)3.1 范围for的语法 四、指针空值nullptr(C11)4.1 C98中的指针空值 所属专栏:C初阶 一、内联函数 1.1概念 以inline修饰的函…

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

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

小程序 获取 手机号 47001 data format error hint

0.场景 后端获取小程序用户手机号 ,api文档 https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html 使用hutool工具作为http client 1. 正确的写法 正确示例 String tencentUrl StringUtils.format("https://api…

C++vector的使用方法

文章目录 一、vector的介绍1. 文档链接2. 简要介绍 二、vector的使用1.vector的定义&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;拷贝构造函数&#xff08;2&#xff09;赋值重载 2. vector 增删查改&#xff08;1&#xff09;operator []&#xff08;2&#x…

[HackMyVM]靶场 Quick3

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (U…

树状数组+离散化求逆序对超详细讲解!

树状数组离散化求逆序对 用一个数组 w [ ] w[] w[]来记录遍历到当前数时&#xff0c;每个数出现的次数 由于只关心每个数前边有多少个数比他大&#xff0c;遍历到 i i i时&#xff0c;求大于 a [ i ] a[i] a[i]的数有多少个&#xff0c;就是对 [ a [ i ] , n ] [a[i], n] [a[i…

HTML—常用标签

常用标签&#xff1a; 标题标签&#xff1a;<h1></h1>......<h6></h6>段落标签&#xff1a;<p></p>换行标签&#xff1a;<br/>列表&#xff1a;无序列表<ul><li></li></ul> 有序列表<ol>&…

她们正在影响AI进程

今天是3月8日&#xff0c;祝广大女性同胞节日快乐&#xff01; 当下&#xff0c;人工智能正是全球科技圈最受关注的领域&#xff0c;甚至没有之一。 在人工智能领域诞生兴起的几十年内&#xff0c;女性科学家作为重要力量&#xff0c;一直在推动行业不断向前发展。 从基础算…

详谈数据结构数组名的含义

谈及背景 int a[3]; sizeof(arr) 12B &#xff0c;这个让我很不理解&#xff0c;后来通过一系列调查研究出了sizeof 一些性质: sizeof()是单目运算符&#xff0c;和‘’一样&#xff0c;不是库函数。sizeof()算结构体的大小 有对应的规则 算结构体大小与结构体中成员排列的顺序…

c++ primer中文版第五版作业第十八章

仓库地址 文章目录 18.118.218.318.418.518.618.718.818.918.1018.1118.1218.1318.1418.1518.16位置一using声明 位置二using声明 位置一using指示 位置二using指示 18.1718.1818.1918.2018.2118.2218.2318.2418.2518.2618.2618.2818.2918.30 18.1 此时r是一个range_error类型…

并查集(蓝桥杯 C++ 题目 代码 注解)

目录 介绍&#xff1a; 模板&#xff1a; 题目一&#xff08;合根植物&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;蓝桥幼儿园&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;小猪存钱罐&#xff09;&#xff1a; 代码&#xff1a; …

WebGL之使用着色器将颜色应用于 WebGL

在之前的展示中我们已经创建好了一个正方形&#xff0c;接下来我们要做的就是给它添加一抹色彩。添加颜色可以通过修改着色器来实现。 给顶点着色 在 WebGL 中&#xff0c;物体是由一系列顶点组成的&#xff0c;每一个顶点都有位置和颜色信息。在默认情况下&#xff0c;所有像…

异常-Exception

文章目录 异常-Exception常见的运行时异常NullPointerException&#xff08;空指针异常&#xff09;ArithmeticException&#xff08;数学运算异常&#xff09;ArrayIndexOutOfBoundsException&#xff08;数组下标越界异常&#xff09;ClassCastException&#xff08;类型转换…

Basis运维日常检查清单- Checklist

检查SYSTEM 是否正常GUI登入登入到系统检查所有应用服务器是否活动正常SM51检查所有SAP Instance服务器运行是否正常.检查工作进程进行SM50检查是否有运行时间很长Local ProcessSM66检查是否有运行时间很长Global Process检查陈旧锁定条目SM12在User ID栏输入*. 检查前期的锁列…

网络编程聊天室

客户端 #include <myhead.h> //创建结构体存储用户信息 struct User {char tape;char username[32];char msg[1024]; };int main(int argc, const char *argv[]) {//创建套接字与服务器进行通信int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("socket err…

鸿蒙实战开发Camera组件:【相机】

相机组件支持相机业务的开发&#xff0c;开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发&#xff0c;最常见的操作如&#xff1a;预览、拍照和录像等。 基本概念 拍照 此功能用于拍摄采集照片。 预览 此功能用于在开启相机后&#xff0c;在缓冲区内重复采集…

django默认后台管理显示内容深化设置

1、设置models字段展示为只读模式 如某个字段在展示时不允许修改&#xff0c;可在admin.py的注册类下重写函数get_readonly_fields&#xff0c;例&#xff1a; def get_readonly_fields(self, request, objNone): return (dwdm,dwmc,"zjs","yyj"…

ARC-Challenge数据集分享

来源: AINLPer公众号&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2024-2-28 该数据集由Allen Institute for Artificial Intelligence&#xff08;AI2&#xff09;发布&#xff0c;旨在推动高级问答的研究。该数据集包含…