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中的元素交给L
            int x=*R.begin();
            sum+=x;
            R.erase(R.find(x));
            L.insert(x);
        };

        auto LtoR=[&](){//将L中的元素交给R
            int 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,否则就停止。

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

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

相关文章

Go语言基础之单元测试

1.go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的&#xff0c;并不需要学习新的语法、规则或工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_test.go为后缀名的源代码文件都是go …

【时间安排】

最近刚刚回到家&#xff0c;到家就是会有各种事情干扰&#xff0c;心里变乱人变懒的&#xff0c;而要做的事情也要继续&#xff0c;写论文&#xff0c;改简历&#xff0c;学习新技能。。 明天后天两天写论文改简历 周一&#xff08;早上去城市书房&#xff0c;可能吵一点戴个耳…

Java 的反射学习总结

一、什么是反射&#xff1f; 反射是指在运行时动态地获取、检查和修改类或对象的信息的能力&#xff0c;不需要在编译时知道类的具体细节。 二、如何获取类对象&#xff1f; 三、如何通过类对象来创建类的对象&#xff1f; 四、类对象获取类构造器的方式 通过获取私有构造器创…

招聘网站简单爬虫_24.1.26

完整程序传送门 24.1.26 前些天接了一个大两届的师兄的小活&#xff0c;做了一下爬boss直聘岗位信息的程序&#xff0c;在这里记录一下 程序框架 定义一个名为paQu的接口函数&#xff0c;用于检查窗口的输入&#xff0c;它接受一个参数self&#xff0c;获取self对象的a属性&am…

vmware-VCSA6.0部署

下载vcsa的iso包&#xff0c;解压后首先安装VMware-ClientIntegrationPlugin-6.0.0-6823256.exe 如果不配置域名配置成ip地址也可以 https://172.16.51.202/

1948-2022年金融许可信息明细数据

1948-2022年金融许可信息明细数据 1、时间&#xff1a;1948-2022年 2、来源&#xff1a;银监会&#xff08;银监会许可证发布系统&#xff09; 3、指标&#xff1a;来源表、机构编码、机构名称、所属银行、机构类型、业务范围、机构住所、地理坐标、行政区划代码、所属区县、…

Cloudreve的部署、迁移与新增离线下载节点

如果你是一个万物皆想编译的大佬&#xff0c;那么可以参考这里的官方文档&#xff1a; 构建 - Cloudreve 我们以使用官方提供的已编译的二进制文件部署为例 首先需要购买一台服务器&#xff0c;推荐使用美国等境外服务器&#xff0c;配置1核1G即可&#xff0c;但推荐2核2G Cl…

C++this指针

我们由一个题目引入&#xff1a; class Date { public:void Init(int year2024, int month1, int day27){_year year;_month month;_day day;}void Print(){cout << _year << "-" << _month << "-" << _day << en…

阿里云推出第八代企业级实例 g8i:AI 推理性能最高提升 7 倍、可支持 72B 大语言模型

云布道师 1 月 11 日&#xff0c;全球领先的云计算厂商阿里云宣布推出第八代企业级通用计算实例 ECS g8i&#xff0c;这也是国内首款搭载第五代英特尔至强可扩展处理器&#xff08;代号 EMR&#xff09;的云计算产品。依托阿里云自研的「飞天CIPU」架构体系&#xff0c;ECS g8…

分布式事务入门,最终一致性方案

分布式事务 回顾分布式事务 上篇内容我们说到了分布式事务的基本内容&#xff0c;讲到了分布式事务的实现主要有事务协调以及最终一致性两件事情来完成整个逻辑。 那么上个文章我们说过了 2PC、3PC、XA 三种协调事务的协议&#xff0c;这次我们来说事务协调处理完成后&#x…

node.js 分布式锁看这篇就够用了

Redis SETNX 命令背后的原理探究 当然&#xff0c;让我们通过一个简单的例子&#xff0c;使用 Redis CLI&#xff08;命令行界面&#xff09;来模拟获取锁和释放锁的过程。 在此示例中 获取锁: # 首先&#xff0c;设置锁密钥的唯一值和过期时间(秒) 127.0.0.1:6379> SET …

小型商用机器人,如何做到小而强?

兼顾体型和性能。 体型和性能的矛盾 一直以来&#xff0c;商用清洁机器人的应用场景主要集中在大型商场、超市、写字楼等&#xff0c;为什么1000平米以下的小型商超等中小场景却很少涉足&#xff1f;原因可以说有很多&#xff0c;但核心为两方面&#xff0c;一方面&#xff0…

2024幻兽帕鲁服务器,阿里云配置

阿里云幻兽帕鲁服务器Palworld服务器推荐4核16G配置&#xff0c;可以选择通用型g7实例或通用算力型u1实例&#xff0c;ECS通用型g7实例4核16G配置价格是502.32元一个月&#xff0c;算力型u1实例4核16G是432.0元/月&#xff0c;经济型e实例是共享型云服务器&#xff0c;价格是32…

Metaphor(EXA) 基于大语言模型的搜索引擎

文章目录 关于 Metaphor使用示例 关于 Metaphor Metaphor是基于大语言模型的搜索引擎&#xff0c;允许用户使用完整的句子和自然语言搜索&#xff0c;还可以模拟人们在互联网上分享和谈论链接的方式进行查询内容。 Metaphor同时还能与LLMs结合使用&#xff0c;允许LLMs连接互联…

网络安全04-sql注入靶场第一关

目录 一、环境准备 1.1我们进入第一关也如图&#xff1a; ​编辑 二、正式开始第一关讲述 2.1很明显它让我们在标签上输入一个ID&#xff0c;那我们就输入在链接后面加?id1 ​编辑 2.2链接后面加个单引号()查看返回的内容&#xff0c;127.0.0.1/sqli/less-1/?id1,id1 …

粒子群优化算法(Particle Swarm Optimization,PSO)求解基于移动边缘计算的任务卸载与资源调度优化(提供MATLAB代码)

一、优化模型介绍 移动边缘计算的任务卸载与资源调度优化原理是通过利用配备计算资源的移动无人机来为本地资源有限的移动用户提供计算卸载机会&#xff0c;以减轻用户设备的计算负担并提高计算性能。具体原理如下&#xff1a; 任务卸载&#xff1a;移动边缘计算系统将用户的计…

网站防护可以采用高防SCDN吗?

随着网络攻击日益复杂和频繁&#xff0c;网站安全已经成为业界的头等大事。在这个背景下&#xff0c;高防SCDN&#xff08;高防御内容分发网络&#xff09;作为一种强大的网络保护工具&#xff0c;正逐渐成为各类网站不可或缺的安全设施。很多人会问&#xff0c;网站防护可以采…

项目解决方案:4G/5G看交通数字化视频服务平台技术方案

目 录 1.总体描述 2.系统结构图 3.系统功能 3.1 信息交互 3.2 语音对讲 3.3 实时码流转换 3.4 流媒体集群和扩容 3.5 负载均衡 3.6 流媒体分发 3.7 流媒体点播 4.系统标准 4.1 流媒体传输 4.2 视频格式 4.3 质量标准 5.设备清单 1.总体描述 视频监控平…

【学术论文写作 笔记02】 鲁棒性实验写作的行文逻辑

文章目录 一、声明二、行文思路三、示例范文一范文二 一、声明 自己总结的&#xff0c;有问题望指正&#xff01; 二、行文思路 为什么要做鲁棒性测试怎么做实验结论对结果的解释 三、示例 PPT 范文一 2022, TIM, “A Robust and Reliable Point Cloud Recognition Netw…

跟着cherno手搓游戏引擎【13】着色器(shader)

创建着色器类&#xff1a; shader.h:初始化、绑定和解绑方法&#xff1a; #pragma once #include <string> namespace YOTO {class Shader {public:Shader(const std::string& vertexSrc, const std::string& fragmentSrc);~Shader();void Bind()const;void Un…