LeetCode---387周赛

题目列表

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

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

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

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

一、将元素分配到两个数组中I

直接按照题目要求进行模拟即可,代码如下

class Solution {
public:vector<int> resultArray(vector<int>& nums) {int n=nums.size();vector<int>arr1={nums[0]},arr2={nums[1]};for(int i=2;i<n;i++){if(arr1.back()>arr2.back()) arr1.push_back(nums[i]);else arr2.push_back(nums[i]);// (arr1.back() > arr2.back() ? arr1 : arr2).push_back(nums[i]);}arr1.insert(arr1.end(),arr2.begin(),arr2.end());return arr1;}
};

二、元素和小于等于k的子矩阵的数目

这题就是求二维前缀和中小于等于k的个数,原理如下

代码如下

class Solution {
public:int countSubmatrices(vector<vector<int>>& grid, int k) {int n=grid.size(),m=grid[0].size(),ans=0;vector<vector<int>>dp(n+1,vector<int>(m+1));for(int i=0;i<n;i++){for(int j=0;j<m;j++){dp[i+1][j+1]=dp[i][j+1]+dp[i+1][j]-dp[i][j]+grid[i][j];if(dp[i+1][j+1]<=k) ans++;}}return ans;}
};

三、在矩阵上写出字母Y所需的最小操作次数

这题的思路其实就是模拟:由于这题的表格中的数字只有0,1,2,所以我们可以直接暴力枚举出所有的可能结果。我们首先要统计一下整个矩阵中0,1,2出现的次数,然后再统计一下组成Y的元素中0,1,2的个数(注意组成Y的元素的下标是有规律的),然后暴力枚举所有的可能结果就行。

代码如下

class Solution {
public:int minimumOperationsToWriteY(vector<vector<int>>& grid) {int n=grid.size(),m=grid[0].size();int sum[3]={0};for(auto& v:grid){for(auto& x:v){sum[x]++;}}int cnt[3]={0};for(int i=0;i<n/2;i++){cnt[grid[i][i]]++;cnt[grid[i][n-1-i]]++;}for(int i=n/2;i<n;i++){cnt[grid[i][n/2]]++;}for(int i=0;i<3;i++) sum[i]-=cnt[i];//在Y之外的数据中0,1,2的个数int ans = n*m;for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(i==j) continue;ans=min(ans,n*m-sum[i]-cnt[j]);}}return ans;}
};

扩展:如果grid[i][j]中的数据范围变大了怎么办?(比如变成了0~1e5) 暴力就会超时,如何做?

其实要想让操作次数变少,由于矩阵的大小是确定的,我们只要让保持不变的数据尽可能的多就行,本质就是统计组成Y的元素中出现次数最多和次多的元素个数,和不在Y上的出现次数最多和次多的元素个数,因为我们还要保证组成Y的元素和不在Y上的元素要不一样才行

四、将元素分配到两个数组中II

这题的难点在于greaterCount函数如何去实现,因为我们不仅要查询符合条件的元素个数还要增加元素,这需要用到树状数组(用于解决关于前缀和/前缀最值问题)。

(如果不了解的,可以去看五分钟丝滑动画讲解 | 树状数组_哔哩哔哩_bilibili,讲得简单易懂,这里就不做过多介绍了) 

代码如下

class BIT{
private:vector<int> tree;// tree[i]表示<=tmp[i]的元素个数//注意树状数组的第一个元素要从下标1开始
public:BIT(int n):tree(n+1){}//所以要多开一个空间void update(int i,int val=1){while(i<tree.size()){tree[i]+=val;i += (i & -i);}}int pre_sum(int i){int res = 0;while(i>0){res+=tree[i];i&=(i-1);//i -= (i&-i);}return res;}
};
class Solution {
public:vector<int> resultArray(vector<int>& nums) {int n=nums.size();//排序+去重+离散化//作用:将不连续的数字映射到一段连续的数字(即下标)中,并保持它们的大小关系vector<int>tmp(nums);sort(tmp.begin(),tmp.end());tmp.erase(unique(tmp.begin(),tmp.end()),tmp.end());//vector<int>arr1={nums[0]};BIT t1(n);auto idx = upper_bound(tmp.begin(),tmp.end(),nums[0]) - tmp.begin();t1.update(idx);vector<int>arr2={nums[1]};BIT t2(n);idx = upper_bound(tmp.begin(),tmp.end(),nums[1]) - tmp.begin();t2.update(idx);for(int i=2;i<n;i++){idx = upper_bound(tmp.begin(),tmp.end(),nums[i]) - tmp.begin();int cnt1 = arr1.size() - t1.pre_sum(idx);int cnt2 = arr2.size() - t2.pre_sum(idx);if(cnt1>cnt2){arr1.push_back(nums[i]);t1.update(idx);}else if(cnt1<cnt2){arr2.push_back(nums[i]);t2.update(idx);}else{if(arr1.size()>arr2.size()){arr2.push_back(nums[i]);t2.update(idx);}else{arr1.push_back(nums[i]);t1.update(idx);}}}arr1.insert(arr1.end(),arr2.begin(),arr2.end());return arr1;}
};

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

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

相关文章

upload-labs通关记录

文章目录 前言 1.pass-012.pass-023.pass-034.pass-045.pass-056.pass-067.pass-078.pass-089.pass-0910.pass-1011.pass-1112.pass-1213.pass-1314.pass-1415.pass-1516.pass-1617.pass-1718.pass-1819.pass-19 前言 本篇文章记录upload-labs中&#xff0c;所有的通过技巧和各…

【MATLAB】MATLAB转C/C++语言并部署到VS2019

首先将你要转换的代码保存 function [outputArg1, outputArg2] test(inputArg1,inputArg2)print(inputArg1inputArg2)outputArg1double(inputArg1inputArg2);outputArg2double(inputArg1*inputArg2); end在APP中找到MATLAB Coder 选择保存的文件 C/C中需要给变量定义类型&…

使用Julia语言和R语言实现K-均值

K-均值算法基础 K-均值聚类算法属于一种无监督学习的方法&#xff0c;通过迭代的方式将数据划分为K个不重叠的子集&#xff08;簇&#xff09;&#xff0c;每个子集由其内部数据点的平均值来表示。计算方法大体如下&#xff1a; 1.初始化簇中心 选择K个数据点作为初始的簇中心…

C++学习笔记:AVL树

AVL树 什么是AVL树?AVL树节点的定义AVL树的插入平衡因子调整旋转调整左旋转右旋转左右双旋右左双旋 AVL树完整代码实现 什么是AVL树? AVL是1962年,两位俄罗斯数学家G.M.Adelson-Velskii和E.M.Landis 为了解决如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找…

物流分拣漫LiDAR反射板

激光雷达漫反射板是物流分拣中不可或缺的一种设备&#xff0c;它在物流分拣过程中发挥着重要的作用。漫反射板的主要功能是反射光线&#xff0c;使得光线能够在分拣区域内均匀分布&#xff0c;从而提高分拣设备的识别精度和效率。 物流分拣是现代物流系统中非常关键的一环&…

HarmonyOS NEXT应用开发之MpChart图表实现案例

介绍 MpChart是一个包含各种类型图表的图表库&#xff0c;主要用于业务数据汇总&#xff0c;例如销售数据走势图&#xff0c;股价走势图等场景中使用&#xff0c;方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示&#xf…

C#实现快速排序算法

C#实现快速排序算法 以下是C#中的快速排序算法实现示例&#xff1a; using System;class QuickSort {// 快速排序入口函数public static void Sort(int[] array){QuickSortRecursive(array, 0, array.Length - 1);}// 递归函数实现快速排序private static void QuickSortRecu…

赶紧来学Python回调函数

在Python中&#xff0c;回调函数是一种非常重要的编程概念&#xff0c;它允许我们将一个函数作为参数传递给另一个函数&#xff0c;并在需要时由另一个函数调用。回调函数的使用可以使代码更加灵活和可重用&#xff0c;尤其在异步编程、事件驱动编程中非常常用。 1.普通函数调…

读已提交隔离级别下竟然有间隙锁

业务背景 广告主痛点的为进行一次全媒体联合投放&#xff0c;若投放10个媒体&#xff0c;需要制作和上传10个创意、50张不同尺寸和出血区要求的图片和视频素材、近100个元素&#xff0c;投放成本极高。这也是制约部分用户使用新产品投放的原因。 因此进行升级。以三个创意为例…

Python匿名函数有知道的吗?

1.函数 按照函数是否有名字分为有名字的函数和匿名函数 匿名函数&#xff1a;定义函数时&#xff0c;不再使用def关键字声明函数&#xff0c;而是使用lambda表达式 匿名函数在需要执行简单的操作时非常有用&#xff0c;可以减少代码冗余 2.有名字的函数 def fn(n):return …

【ONE·基础算法 || 滑动窗口】

总言 主要内容&#xff1a;编程题举例&#xff0c;理解滑动窗口的思想。&#xff08;是什么&#xff1f;什么时候用&#xff1f;为什么能用&#xff1f;时间复杂度&#xff1f;如何写代码&#xff1f;&#xff09;       文章目录 总言1、滑动窗口2、长度最小的子数组&…

vue组件之间通信方式汇总

方式1&#xff1a;props和$emit props和$emit仅仅限制在父子组件中使用 1.props&#xff1a;父组件向子组件传递数据 1.1 代码展示 <template><div><!-- 这是父组件 --><div>父组件中的基本数据类型age的值是:{{this.age}}</div><div>…