LeetCode---122双周赛

题目列表

3010. 将数组分成最小总代价的子数组 I

3011. 判断一个数组是否可以变为有序

3012. 通过操作使数组长度最小

3013. 将数组分成最小总代价的子数组 II

一、将数组分成最小总代价的子数组I

这道题纯纯阅读理解题,关键在于理解题意。注意:第一个元素作为第一个子数组的代价是必选的!!!我们只要选后面的两个子数组的代价即可。也就是找出两个元素让它们的元素和最小,即找到剩余元素的两个最小值

代码如下

class Solution {
public:int minimumCost(vector<int>& nums) {int n=nums.size();int mn_1=INT_MAX,mn_2=INT_MAX;for(int i=1;i<n;i++){if(nums[i]<mn_1) mn_2=mn_1,mn_1=nums[i];else if(nums[i]<mn_2) mn_2=nums[i];}return nums[0]+mn_1+mn_2;}
};

二、判断一个数组是否可以变成有序 

这题只要按照题目要求模拟即可,用分组循环的技巧,将数组分为一段段可以交换的区间,然后排序即可,然后判断整个数组是否有序,当然也可以不排序,只要维护每个区间的最大值和最小值即可,然后看前后区间的最大值和最小值是否满足有序。题目说的有序是升序

代码如下

class Solution {
public:bool canSortArray(vector<int>& nums) {int n=nums.size();//分组循环int i=0;while(i<n){int j=i++;int x=__builtin_popcount(nums[j]);while(i<n&&x==__builtin_popcount(nums[i]))i++;//得到满足条件的区间[j,i)//排序sort(nums.begin()+j,nums.begin()+i);}for(int i=0;i<n-1;i++)if(nums[i]>nums[i+1])return false;return true;}
};//用最大值和最小值维护有序
class Solution {
public:bool canSortArray(vector<int>& nums) {int n=nums.size();//分组循环int i=0;int pre_mx=INT_MIN;while(i<n){int j=i++;int x=__builtin_popcount(nums[j]);int mn=nums[j],mx=nums[j];while(i<n&&x==__builtin_popcount(nums[i])){mn=min(mn,nums[i]);mx=max(mx,nums[i]);i++;}//得到满足条件的区间[j,i)if(pre_mx>mn) return false;pre_mx=mx;}return true;}
};

三、通过操作使得数组长度最小

这题说难不难,说简单不简单,关键在于你能否想到"点子"上。

如何去思考?首先这题和数组顺序无关(或者说数组顺序不影响结果),我们先将数组排序,然后再去结合示例去模拟,看能不能发现什么性质/规律。明确一点1是答案的最小值

我们知道取模运算只会让数字越来越小,那么是用大数%小数好,还是小数%大树好?

(1) 如果小数%大数,必然得到小数,也就是能保证去掉一个元素

=> 1、 如果只有一个最小元素,我们就可以拿它和其他数字依次组合,直到只剩下它,答案为1

=> 2、如果有n个最小元素,我们可以拿其中一个将其他元素删除,然后再进行两两操作,答案为(n+1)/2,在不考虑大数%小数出现更小的非零数的情况下,这个答案必然是最优的(因为我们这样的操作剔除了其他数的干扰,而其他的数只有在出现取模操作出现更小的值的时候才会使得答案为1,其他情况答案就只会变大/不变)。

(2) 如果大数%小数,得到的数字必然比小数小,但是也有可能是0 

=>  1、如果得到的结果为0,即有倍数关系,那么长度就必然会加1,我们不希望这样做

=>  2、如果得到的结果不为1,那么得到的数就有可能是最小的数字,就有可能得到最小答案1,即在用(1)得到答案之前,我们还要先判断是否能通过大数%小数得到一个最小数

如何判断?根据取模运算只会让数字越来越小的特性,我们选择让大于最小值的数都%最小值,如果其中一个取模结果大于零,则得到的数必然小于最小值,答案为1,不然答案就是(n+1)/2。

或许你会觉得,我们这样好像不能概括所有大数%小数的情况,即可以出现其他的大数%不是最小值的一个小数得到最小值的情况。

关于这一点,我们来想想我们的做法的本质是什么?就是看数组中的数是否全是最小值的倍数。即我们将数组中出现的情况分为两种:

1、全是最小值的倍数,那么我们无论如何操作,都不可能得到比最小值还小的数,那么我们最优方案就是(1)中的第二种情况,答案为(n+1)/2

2、不全是最小值的倍数,那么我们必然能得到一个比最小值还小的数,答案就是1

代码如下

class Solution {
public:int minimumArrayLength(vector<int>& nums) {int n=nums.size();if(n<=2) return 1;sort(nums.begin(),nums.end());for(int i=n-1;i>=1;i--){if(nums[i]%nums[0])return 1;}int cnt=count(nums.begin(),nums.end(),nums[0]);return (cnt+1)/2;}
};

四、将数组分成最小总代价的子数组II

这题相较于第一题,除了数据范围变大以外,还多了几个条件,本质就是让我们维护一个长度为dist的滑窗中的最小的k-1个数的和,求最小值即可

注意:第一个元素作为第一个子数组的代价是必选的,我们只要选后面的k-1个子数组的代价即可

这题思路起始很简单,滑窗+维护滑窗中k-1个最小值, 关键在于如何去维护滑窗中k-1个最小值?需要用到对顶堆这个数据结构,简单来说就是用两个堆,一个大堆存放k-1个最小值,一个小堆存放滑窗中其他的数字,然后动态的维护这两个堆就行。

具体代码实现如下

class Solution {typedef long long LL;
public:long long minimumCost(vector<int>& nums, int k, int dist) {k--;//维护k-1个最小元素的和LL sum=accumulate(nums.begin()+1,nums.begin()+dist+2,0LL);//L为大堆,R为小堆,用muiltset模拟实现multiset<int>L(nums.begin()+1,nums.begin()+dist+2),R;auto RtoL=[&](){//将R中的元素交给Lint x=*R.begin();sum+=x;R.erase(R.find(x));L.insert(x);};auto LtoR=[&](){//将L中的元素交给Rint x=*L.rbegin();sum-=x;L.erase(L.find(x));R.insert(x);};while(L.size()>k)LtoR();LL ans=sum;for(int i=dist+2;i<nums.size();i++){int left=nums[i-dist-1];auto it=L.find(left);if(it==L.end()) R.erase(R.find(left));else {sum-=left;L.erase(it);}int right=nums[i];if(right<*L.rbegin()){L.insert(right);sum+=right;}else{R.insert(right);}if (L.size() == k - 1) {RtoL();} else if (L.size() == k + 1) {LtoR();}ans=min(ans,sum);}return ans+nums[0];}
};

当然也可以用priority_queue来实现对顶堆,这里简单说一下思路:由于我们无法判断优先级队列中的元素,所以当我们要删除一个元素的时候,我们只能记录被删除的元素,直到我们pop堆顶元素时,随便看接下来的数字是否已经被删除,如果被删除我们就继续pop,否则就停止。

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

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

相关文章

总体方差与样本方差的区别是什么?

总体方差和样本方差是统计学中两个重要概念&#xff0c;它们在定义和计算上有所不同&#xff0c;主要区别体现在数据集的性质和计算公式的分母上&#xff1a; 1. 总体方差&#xff08;Population Variance&#xff09;&#xff1a; 定义&#xff1a; 总体方差是指将一个完整数…

嵌入式——窗口看门狗(WWDG)补充

目录 一、独立看门狗与窗口看门狗 1.功能描述 2.两者区别 二、WWDG功能描述 1.窗口看门狗时钟 2.计数器时钟 3. 计数器 4.窗口值 三、WWDG超时时间 一、独立看门狗与窗口看门狗 1.功能描述 STM32有两个看门狗&#xff1a;一个是独立看门狗&#xff08;IWDG&#xff0…

在知乎上如何写科技文章?

当在知乎上撰写关于科技趋势的文章时&#xff0c;有几个关键的写作技巧和建议可以帮助你获得更好的传播效果&#xff1a; 选题关注热点&#xff1a; 在选择科技趋势时&#xff0c;关注当前的热点话题是很重要的。了解最新的技术、行业动向&#xff0c;选择用户普遍关心和讨论的…

数据结构三:线性表之单链表(带头结点单向)的设计与实现

线性表的链式存储结构正是所谓的单链表&#xff0c;何谓单链表&#xff1f;通过地址将每一个数据元素串起来&#xff0c;进行使用&#xff0c;这可以弥补顺序表在进行任意位置的插入和删除需要进行大量的数据元素移动的缺点&#xff0c;只需要修改指针的指向即可&#xff1b;单…

网络编程套接字(2)

UDP数据报套接字编程 API介绍 DatagramSocket DatagramSocket是UDP的Socket,用于发送和接收数据报. 操作系统中有一类文件,就叫做socket文件(普通文件/目录文件:在硬盘上的) socket文件:抽象的表示了网卡这样的硬件设备 DatagramSocket就是对socket文件进行读写,也就是借助网…

对于gzip的了解

gzip基本操作原理&#xff1a;通过消除文件中的冗余信息&#xff0c;使用哈夫曼编码等算法&#xff0c;将文件体积压缩到最小。这种数据压缩方式在网络传输中发挥了巨大作用&#xff0c;减小了传输数据的大小&#xff0c;从而提高了网页加载速度。 静态资源 Vue Vue CLl修改v…

WordPress如何使用SQL实现一键关闭/开启评论功能(已有评论)

WordPress本人就自带评论功能&#xff0c;不过由于种种原因&#xff0c;有些站长不想开启评论功能&#xff0c;那么应该怎么实现一键关闭评论功能或开启评论功能呢&#xff1f;或者针对已有评论功能的文章进行一键关闭或开启评论功能应该怎么操作&#xff1f; 如果你使用的Wor…

【.NET Core】深入理解C#中的特殊字符

【.NET Core】深入理解C#中的特殊字符 文章目录 【.NET Core】深入理解C#中的特殊字符一、概述二、$-- 字符串内插2.1 内插字符串的结构2.2 内插原始字符串字面量2.3 特殊字符2.4 内插字符串编译 三、-- 逐字字符串标识符四、“”“--原始字符串文本 一、概述 特殊字符是预定义…

【网易】资深Java开发工程师/专家(采购系统方向)

全职 | 杭州市 | 2024-01-26 更新 职位描述 负责企业信息化采购系统研发。重点关注系统并发性能、可靠性等方面&#xff0c;解决系统技术难点&#xff0c;参与架构持续升级。关注互联网和企业信息化热点技术的发展方向&#xff0c;能够提出、评估并应用新技术。参与系统需求分…

OpenGL/C++_学习笔记(四)空间概念与摄像头

汇总页 上一篇: OpenGL/C_学习笔记&#xff08;三&#xff09; 绘制第一个图形 OpenGL/C_学习笔记&#xff08;四&#xff09;空间概念与摄像头 空间概念与摄像头前置科技树: 线性代数空间概念流程简述各空间相关概念详述 空间概念与摄像头 前置科技树: 线性代数 矩阵/向量定…

嵌入式产品的开发流程

嵌入式产品的开发流程主要涉及硬件和软件两个方面&#xff0c;通常包括以下主要阶段和角色&#xff1a; 嵌入式产品开发流程 1. 需求分析阶段&#xff1a; 角色&#xff1a; 产品经理、系统工程师 任务&#xff1a; 确定产品的功能和性能需求&#xff0c;明确硬件和软件的基…

RPC教程 5.支持HTTP协议

1.HTTP的CONNECT方法 Web 开发中&#xff0c;我们经常使用 HTTP 协议中的 HEAD、GET、POST 等方式发送请求&#xff0c;等待响应。但 RPC 的消息格式与标准的 HTTP 协议并不兼容&#xff0c;在这种情况下&#xff0c;就需要一个协议的转换过程。HTTP 协议的 CONNECT 方法提供了…

在Java中,IO主要分为两种:同步阻塞IO(BIO)和NIO(New IO,也称为Non-blocking IO)。

IO&#xff08;Input/Output&#xff09;是指输入和输出&#xff0c;是程序与外部世界或者程序与程序之间进行数据交换的一种方式。在Java中&#xff0c;IO主要分为两种&#xff1a;同步阻塞IO&#xff08;BIO&#xff09;和NIO&#xff08;New IO&#xff0c;也称为Non-blocki…

51单片机-4G模块

51单片机-4G模块 4G控制LED #include "reg52.h" #include "intrins.h" #include <string.h>#define SIZE 12 sfr AUXR 0x8E; sbit D5 P3^7; char cmd[SIZE];void UartInit(void) //9600bps11.0592MHz {AUXR 0x01;SCON 0x50; //配置串口工作方…

MybatisPlus二级映射和关联对象ResultMap

文章目录 一、业务背景1. 数据库表结构2. 需求 二、使用映射直接得到指定结构三、其他文件1. Mapper2. Service3. Controller 四、概念理解一级映射二级映射聚合 五、标签使用1. \<collection\> 标签2. \<association\> 标签 在我们的教程中&#xff0c;我们设计了…

flask框架制作前端网页作为GUI

一、语法和原理 &#xff08;一&#xff09;、文件目录结构 需要注意的问题&#xff1a;启动文件命名必须是app.py。 一个典型的Flask应用通常包含以下几个基本文件和文件夹&#xff1a; app.py&#xff1a;应用的入口文件&#xff0c;包含了应用的初始化和配置。 requirem…

MySQL中四种索引类型

FULLTEXT &#xff1a;即为全文索引&#xff0c;目前只有MyISAM引擎支持。其可以在CREATE TABLE &#xff0c;ALTER TABLE &#xff0c;CREATE INDEX 使用&#xff0c;不过目前只有 CHAR、VARCHAR &#xff0c;TEXT 列上可以创建全文索引&#xff0c;需要注意的是MySQL5.6以后支…

Controller的部分注解

目录 1.增加 用到注解 1.1RequestBody注解解析&#xff1a; 2.查询方法当中参数不用注解&#xff01; 3.起售停售用到注解 3.1PathVariable解析 4.删除菜品注解 4.1RequestParam 5.修改用到的注解 5.1修改分两步 用到两个注解 6&#xff1a;总结 1.增加 用到注解…

【DeepLearning-8】MobileViT模块配置

完整代码&#xff1a; import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

Java基础知识-异常

资料来自黑马程序员 异常 异常&#xff0c;就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是&#xff1a; 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;…