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.hqwc.cn/news/522629.html

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

相关文章

给一篇word注音可不可以只要拼音不要汉字 word中如何只保留拼音不要汉字

word中如何只保留拼音不要汉字&#xff0c;如果你想要只保留拼音而去除汉字&#xff0c;可以通过一系列步骤来实现。以下是一个详细的教程&#xff0c;帮助你完成这个任务。 首先&#xff0c;确保你的电脑已经安装了“汇帮注音大师”软件。如果没有&#xff0c;你需要安装一下…

异常-Exception

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

面试经典150题——两数相加

​Anything is worth "fighting for," and when you get it, dont doubt it, you deserve it, you deserve it. 1. 题目描述 2. 题目分析与解析 2.1 思路一 这个题目虽然标的是中等&#xff0c;但是大家看一下应该还是比较容易想到思路的&#xff0c;这不就相当于…

储能系统---交流充电桩(三)

一、充电模式及其功能要求 关注公众号 --- 小Q下午茶 新国标在标准 GB/T 18487.1-2015《电动汽车传导充电系统 第1部分&#xff1a;通用要求》中规定了 4 种充电模式&#xff0c;下面将对这 4 种充电模式及其功能要求进行介绍。 1.1 、模式 1 模式 1 是指在充电系统中应使用…

《解密云计算:企业之选》

前言 在当今数字化时代&#xff0c;企业面临着巨大的数据处理压力和信息化需求&#xff0c;传统的IT架构已经无法满足日益增长的业务需求。在这样的背景下&#xff0c;越来越多的企业开始转向云计算&#xff0c;以实现灵活、高效和可扩展的IT资源管理和利用。 云计算 云计算是…

群智能优化算法:巨型犰狳优化算法(GAO)求解23个基准函数(提供MATLAB代码)

一、巨型犰狳优化算法 巨型犰狳优化算法&#xff08;Giant Armadillo Optimization&#xff0c;GAO&#xff09;由Omar Alsayyed等人于2023年提出&#xff0c;该算法模仿了巨型犰狳在野外的自然行为。GAO设计的基本灵感来自巨型犰狳向猎物位置移动和挖掘白蚁丘的狩猎策略。GAO…

同等学力申硕专业介绍——管理学硕士

同等学力申硕的专业很多。 目前有十三大门类&#xff0c;分别是医学、法学、管理学、工学、教育学、经济学、艺术学、文学、历史学、理学、哲学、农学、军事学等&#xff0c;每个大门类中都有很多的细分专业。 今天为大家介绍同等学力申硕专业——管理学。 专业介绍 管理学是…

7. 可集成性

第7章 可集成性 融合是生活的基本法则&#xff1b;当我们抵制它时&#xff0c;瓦解是我们内心和外部的自然结果。因此&#xff0c;我们得出了通过整合实现和谐的概念。 —Norman Cousins 诺曼考辛斯 根据韦氏词典&#xff0c;形容词可集成的意思是“能够被整合”。我们会给你一…

warning: #188-D: enumerated type mixed with another type

警告解释&#xff1a;枚举类型混合了其它的数据类型&#xff1b; 解决方法&#xff1a; 1&#xff1a;检查代码&#xff0c;是不是存在混用&#xff1b;&#xff1b; 2&#xff1a;结构体初始化为 0 报warning&#xff0c;不能将结构体的第一个变量&#xff0c;使用枚举类型&am…

DDoS和CC攻击的原理

目前最常见的网络攻击方式就是CC攻击和DDoS攻击这两种&#xff0c;很多互联网企业服务器遭到攻击后接入我们德迅云安全高防时会问到&#xff0c;什么是CC攻击&#xff0c;什么又是DDoS攻击&#xff0c;这两个有什么区别的&#xff0c;其实清楚它们的攻击原理&#xff0c;也就知…

Java零基础 - 数组的定义和声明

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

【Super数据结构】数据结构入门first step!了解些概念和时空复杂度计算!

&#x1f3e0;关于此专栏&#xff1a;Super数据结构专栏将使用C/C语言介绍顺序表、链表、栈、队列等数据结构&#xff0c;每篇博文会使用尽可能多的代码片段图片的方式。 &#x1f40e;博主首页&#xff1a;Jammingpro &#x1f6aa;归属专栏&#xff1a;Super数据结构 &#x…