LeetCode---122双周赛

news2024/12/23 21:28:30

题目列表

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,否则就停止。

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

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

相关文章

C#常见内存泄漏

背景 在开发中由于对语言特性不了解或经验不足或疏忽&#xff0c;往往会造成一些低级bug。而内存泄漏就是最常见的一个&#xff0c;这个问题在测试过程中&#xff0c;因为操作频次低&#xff0c;而不能完全被暴露出来&#xff1b;而在正式使用时&#xff0c;由于使用次数增加&…

Win32 PE图标资源提取(ICO图标提取)

最近需要写一个提取EXE或者DLL图标资源的功能, 网上找了很久, 要么功能不好用, 最后结果如下: 1.很多是加载为HICON句柄后转换为图片保存, 全损画质..., 2.后来找了个还能用的, 详见 https://github.com/TortoiseGit/TortoiseGit/blob/master/src/Utils/IconExtractor.cpp …

Springboot+Netty搭建基于TCP协议的服务端

文章目录 概要pom依赖Netty的server服务端类Netty通道初始化I/O数据读写处理测试发送消息 并 接收服务端回复异步启动Netty运行截图 概要 Netty是业界最流行的nio框架之一&#xff0c;它具有功能强大、性能优异、可定制性和可扩展性的优点 Netty的优点&#xff1a; 1.API使用简…

深度强化学习(王树森)笔记03

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

分布式id-雪花算法

一、雪花算法介绍 Snowflake&#xff0c;雪花算法是有Twitter开源的分布式ID生成算法&#xff0c;以划分命名空间的方式将64bit位分割成了多个部分&#xff0c;每个部分都有具体的不同含义&#xff0c;在Java中64Bit位的整数是Long类型&#xff0c;所以在Java中Snowflake算法生…

Linux 文件和文件夹的创建与删除

目录 一. 新建1.1 mkdir 新建文件夹1.2 touch 新建空文件1.3 vi命令创建文件1.4 > 和 >> 新建文件 二. 删除 一. 新建 1.1 mkdir 新建文件夹 -p&#xff1a;递归的创建文件夹&#xff0c;当父目录不存在的时候&#xff0c;会自动创建 mkdir -p test1/test2/test31.…

stable-diffusion-webui 汉化(中文界面)

大家好&#xff0c;我是水滴~~ 本文主要介绍 Stable Diffusion WebUI 是如何汉化的&#xff0c;文章详细的介绍汉化过程&#xff0c;并加上配图能够清晰的展示该过程。 Stable Diffusion WebUI 官方并没有出中文界面&#xff0c;需要通过安装插件来汉化&#xff0c;下面是详细…

工业空调转IEC104协议转换网关BE108

随着电力系统信息化建设和数字化转型的进程不断加速&#xff0c;对电力能源的智能化需求也日趋增强。健全稳定的智慧电力系统能够为工业生产、基础设施建设以及国防建设提供稳定的能源支持。在此背景下&#xff0c;高性能的工业电力数据传输解决方案——协议转换网关应运而生&a…

如何免费注册一个二级域名

目录 1.sitelutions账号注册 2.添加域名 3.做A记录或者cname解析步骤 1.sitelutions账号注册 注册网址:Sitelutions - Solutions for your site. All in one place. 打开首页点击右上角的红色 free sign up 来注册。注册只需邮箱即可。 首先填写注册信息,然后提交。提交之后…

Tortoise-tts Better speech synthesis through scaling——TTS论文阅读

笔记地址&#xff1a;https://flowus.cn/share/a79f6286-b48f-42be-8425-2b5d0880c648 【FlowUs 息流】tortoise 论文地址&#xff1a; Better speech synthesis through scaling Abstract: 自回归变换器和DDPM&#xff1a;自回归变换器&#xff08;autoregressive transfo…

算法38:子数组的最小值之和(力扣907题)----单调栈

题目&#xff1a; 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 示例 1&#xff1a; 输入&#xff1a;arr [3,1,2,4] 输出&#xff1a;17 解释&#xff1a; 子数组为 [3]&#xff0c;[…

设计模式:工厂方法模式

工厂模式属于创建型模式&#xff0c;也被称为多态工厂模式&#xff0c;它在创建对象时提供了一种封装机制&#xff0c;将实际创建对象的代码与使用代码分离&#xff0c;有子类决定要实例化的产品是哪一个&#xff0c;把产品的实例化推迟到子类。 使用场景 重复代码 : 创建对象…

机器学习---可能近似正确(PAC)、出错界限框架

1. 计算学习理论概述 从理论上刻画了若干类型的机器学习问题中的困难和若干类型的机器学习算法的能力 这个理论要回答的问题是&#xff1a; 在什么样的条件下成功的学习是可能的&#xff1f; 在什么条件下某个特定的学习算法可保证成功运行&#xff1f; 这里考虑两种框架&…

【开源】基于JAVA+Vue+SpringBoot的固始鹅块销售系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固始鹅块模块2.4 鹅块订单模块2.5 评论管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 鹅块类型表3.2.2 鹅块表3.2.3 鹅块订单表3.2.4 鹅块评论表 四、系统展示五、核心代码5.…

基于C语言的趣味游戏之五子棋

目录 趣味五子棋游戏 第一步 text.c文件 第二步 game.h文件 第三步 初始化 打印棋盘 玩家输入 电脑输入 判断输赢 game.c 趣味五子棋游戏 第一步 先写菜单&#xff0c;然后在主函数里调用&#xff0c;由于这是一个可以重复的游戏所以将do while循环里调用menu函数。…

C/C++ - 类的封装特性

目录 类的封装 语法格式 声明定义 分文件 访问权限 类作用域 对象模型 构造函数 默认构造函数 带参构造函数 拷贝构造函数 构造函数重载 委托构造函数 初始数据列表 构造默认参数 构造函数删除 析构函数 析构函数概念 析构函数特性 析构函数示例 析构调用…

【Unity】【游戏开发】Pico打包后项目出现运行时错误如何Debug

【背景】 开发过程中的报错可以通过控制台查看&#xff0c;但是PICO项目这类依赖特定设备环境的应用往往存在打包后在设备端发生运行时错误。这时如何能查看到Debug信息呢&#xff1f; 【分析】 Pico也是安卓系统&#xff0c;所以这个问题就可以泛化为Unity有哪些在安卓端运…

dnSpy调试工具二次开发2-输出日志到控制台

本文在上一篇文章的基础上继续操作&#xff1a; dnSpy调试工具二次开发1-新增菜单-CSDN博客 经过阅读dnSpy的源码&#xff0c;发现dnSpy使用到的依赖注入用了MEF框架&#xff0c;所以在源码中可以看到接口服务类的上面都打上了Export的特性或在构造方法上面打上ImportingConst…

力扣hot100 最小栈 变种栈

Problem: 155. 最小栈 文章目录 思路&#x1f496; Stack 自定义 Node&#x1f37b; Code 思路 &#x1f469;‍&#x1f3eb; 甜姨 &#x1f496; Stack 自定义 Node 时间复杂度: O ( 1 ) O(1) O(1) 空间复杂度: O ( n ) O(n) O(n) &#x1f37b; Code class MinS…

数据结构-顺序表的实现 [王道]

本博客记录个人寒假学习内容。此篇博客内容为 顺序表的定义。 博客中截图来自王道数据结构公开课 目录 顺序表的定义 顺序表的特点 顺序表的实现--静态分配 顺序表的实现--动态分配 顺序表的定义--知识结构框架 顺序表的定义 >线性表是具有相同(每个数据元素所占的空间…