LeetCode---392周赛

题目列表

3105. 最长的严格递增或递减子数组

3106. 满足距离约束且字典序最小的字符串

3107. 使数组中位数等于 K 的最少操作数

3108. 带权图里旅途的最小代价

一、最长的严格递增或递减子数组

按照题目要求进行模拟即可,这里提供两者思路:

1、两次遍历---我们单独考虑单调递增和单调递减的情况,分组循环就能轻松搞定,这里不多说

2、一次遍历,如何去思考?其实我们在考虑单调性的时候,可以把点连接成线,得到一个折线图(或者把它想象成一个函数),单调增和单调减不会相互影响,它们是独立的,所以我们就可以在一次遍历中统计上坡折线的长度和下坡折线的长度,具体看代码

代码如下

// 分两次遍历,分别计算递增和递减
class Solution {
public:
    int longestMonotonicSubarray(vector<int>& nums) {
        int ans = 1, n = nums.size();
        for(int i=0;i<n;){
            int j=i++;
            while(i<n&&nums[i]>nums[i-1])
                i++;
            ans=max(i-j,ans);
        }
        for(int i=0;i<n;){
            int j=i++;
            while(i<n&&nums[i]<nums[i-1])
                i++;
            ans=max(i-j,ans);
        }
        return ans;
    }
};

//一次遍历,同时计算递增和递减
class Solution {
public:
    int longestMonotonicSubarray(vector<int>& nums) {
        int ans = 1, n = nums.size();
        for(int i=1;i<n;){
            if(nums[i]==nums[i-1]) {
                i++;
                continue;
            }
            // false - nums[i-1]>nums[i]
            // true  - nums[i-1]<nums[i]
            bool flag = nums[i-1]<nums[i]; // 标记当前求的是递增还是递减
            int j = i++;
            while(i<n&&nums[i]!=nums[i-1]&&(nums[i-1]<nums[i])==flag){
                i++;
            }
            ans=max(i-j+1,ans);
        }
        return ans;
    }
};

二、满足距离约束且字典序最小的字符串

这题是简单的贪心:优先考虑将字符串左边的字符向'a'进行变换,这样得到的字符串的字典序是最少的,同时,由于26个字母的变换是环形的,我们还要考虑是向前直接变换成'a'的操作次数少,还是向后变换到'z',再到'a'的操作次数少,综上两点,代码如下

class Solution {
public:
    string getSmallestString(string s, int k) {
        for(auto& e:s){
            int x = e - 'a'; // 向前转到'a'的操作次数
            int y = 'z' - e + 1; // 向后转到'z'再转到'a'的操作次数
            int s = min(x,y);
            if(s<=k){
                e = 'a';
                k -= s;
            }else{
                e -= k; // 如果无法转换到'a',就尽可能向'a'靠
                break;
            }
        }
        return s;
    }
};

三、使数组中位数等于K的最少操作次数

题目要求通过+1-1操作改变数组的中位数,同时操作次数最少。根据贪心,我们可以反向考虑如何让更多的数字不被操作,即哪些数字本身不会对要改变的中位数产生影响。i<=mid&&nums[i]<=k || i>=mid&&nums[i]>k时(mid代表中位数下标),我们不用对进行操作。同时,我们让不符合条件的数变得符合条件即可

代码如下

class Solution {
public:
    long long minOperationsToMakeMedianK(vector<int>& nums, int k) {
        int n = nums.size();
        ranges::sort(nums);
        long long ans = 0;
        int mid = n/2; // 奇数 - 中间数下标,偶数 - 靠右的中间数下标
        if(nums[mid]<k){
            for(int i=mid;i<n;i++){
                if(nums[i]>=k)
                    break;
                ans += k-nums[i];
            }
        }else if(nums[mid]>k){
            for(int i=mid;i>=0;i--){
                if(nums[i]<=k)
                    break;
                ans += nums[i]-k;
            }
        }
        return ans;
    }
};

这里在基于当前问题提出一个更有难度的问题,如果我们要处理的不是将数组的中位数变成k,而是变成k1,k2,k3...,即有多个询问要处理时,我们该怎么做?

如果直接复用上面的代码,我们的时间复杂度为O(n*m),n为数组长度,m为询问的个数。能否优化?其实在上诉代码中,耗时主要是在for循环求区间和,我们可以用前缀和预处理数组,然后用二分快速找到我们需要的区间的左端点/右端点,最后在O(1)的时间内得到答案,时间复杂度为O(mlogn)  【有兴趣的可以自行实现一下】

四、带权图里旅途的最小代价

这题的关键点:

1、&操作的性质 --- 参与&运算的数字越多,得到的结果越小

2、 可以多次访问同一条边或点

(对于&的性质就不做太多说明,不明白的,可以找几个数算一下,验证一下)

题目要求旅费最少,那么我们直接将这两个点所在的连通图中的所有路径都走一遍/多遍(&同一个数不会影响运算结果),得到的旅费必然是最少的。共有如下情况

  • 如果两个点是连通的,那么答案就是两个点所在连通图的所有边权&的结果(也就是说在同一个连通图上的任意两点的最小旅费相同,我们可以预处理)
  • 如果两个点不连通,即无法到达,则答案为-1

注意:如果给的两个点相同,答案为0

将点按照图连不连通进行划分,很标准的并查集的题,代码如下

class Solution {
public:
    vector<int> minimumCost(int n, vector<vector<int>>& edges, vector<vector<int>>& query) {
        // dist代表旅费,赋值为-1是因为-1的二进制表示为全1,不会影响&的运算结果
        vector<int> fa(n,-1),dist(n,-1);
        // 并查集最核心的函数
        function<int(int)>find=[&](int x)->int{
            return fa[x]==-1?x:fa[x]=find(fa[x]);
        };
        for(auto&e:edges){
            int x = e[0], y = e[1], w = e[2];
            int fa_x = find(x), fa_y = find(y);
            if(fa_x!=fa_y){
                fa[fa_x]=fa_y; // 合并两个点所在的集合,将fa_y当作最终的父节点
                dist[fa_y]&=dist[fa_x]; // 计算旅费 --- 注意是谁是最终的父节点,如果想不明白,可以加上一行 dist[fa_x]=dist[fa_y]
            }
            dist[fa_y]&=w; // 同上
        }
        int m = query.size();
        vector<int> ans(m);
        for(int i=0;i<m;i++){
            int x = query[i][0], y = query[i][1];
            int fa_x = find(x), fa_y = find(y);
            if(fa_x!=fa_y) ans[i] = -1;
            else ans[i] = x==y?0:dist[fa_x];
        }
        return ans;
    }
};

这里除了并查集,我们也可以用简单的dfs来解决问题,思想和并查集类似,这里就不多介绍了,代码中的细节还是值得品味的,建议也学一学这种做法。

class Solution {
public:
    vector<int> minimumCost(int n, vector<vector<int>>& edges, vector<vector<int>>& query) {
        vector<vector<pair<int,int>>>g(n);
        for(auto e:edges){
            g[e[0]].emplace_back(e[1],e[2]);
            g[e[1]].emplace_back(e[0],e[2]);
        }
        vector<int> mask(n,-1);
        vector<int> dist;
        // 注意题目中给的图是允许出现环的
        function<int(int)>dfs=[&](int x)->int{
            mask[x] = dist.size();
            int v = -1;
            for(auto [y,w]:g[x]){
                v &= w;
                if(mask[y] < 0){
                    v &= dfs(y);
                }
            }
            return v;
        };

        for(int i = 0; i < n; i++){
            if(mask[i]==-1){
                dist.push_back(dfs(i));
            }
        }

        int m = query.size();
        vector<int> ans(m);
        for(int i=0;i<m;i++){
            int x = query[i][0], y = query[i][1];
            int fa_x = mask[x], fa_y = mask[y];
            if(fa_x!=fa_y) ans[i] = -1;
            else ans[i] = dist[fa_x];
        }
        return ans;
    }
};

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

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

相关文章

AI赋能校园管理,打造平安智慧校园解决方案

背景&#xff1a; 2020年教育部办公厅印发《教育系统安全专项整治三年行动实施方案》&#xff0c;文中要求&#xff0c;学校在所辖范围内组织开展安全专项整治三年行动&#xff0c;健全完善安全责任体系&#xff0c;建立风险管控和隐患治理的安全防控体系&#xff0c;开展消防等…

tRPC架构设计简单理解

互联网发展早期&#xff0c;业务场景差异大&#xff0c;试错迭代速度很快。这导致其后台服务使用的语言技术栈、开发框架、通信协议、服务治理系统、运维平台等或多或少存在差异。 业务发展到一定阶段后&#xff0c;跨业务合作越来越多&#xff0c;组织架构调整也愈发频繁。技…

局域网管理软件哪个好?局域网电脑管理系统实践案例

之前有一个公司案例&#xff0c;是这样的&#xff1a; 公司名称&#xff1a;智慧科技有限公司 背景&#xff1a; 智慧科技有限公司是一家拥有数百名员工的中型企业&#xff0c;随着业务的快速发展&#xff0c;公司面临着网络管理上的挑战。 员工在日常工作中需要频繁地访问…

旧版本jquery升级新版本后如何处理兼容性问题

前言 最近项目在漏洞扫描过程中发现现在的jquery版本受多个跨站点脚本漏洞影响&#xff0c;需要升级jquery版本。 1、首先下载高版本的jquery&#xff0c;我这里升级的是3.6.0 2、对应的bootstrap版本也要升级&#xff0c;这里升级的是3.3.7 本来以为替换完这两个文件后&#…

【SpringBoot】-- 使用minio对象存储服务实现上传图片

目录 一、安装minio 拉取镜像 启动 查看 进入登录页面 创建bucket 二、安装miniomc 三、代码 application.yml MinioUtil Controller 四、拓展 以下基于云服务和docker使用minio服务 一、安装minio Minio 是一个开源的对象存储服务器。它允许用户在私有云环境中建…

全闪存储阵列利用 U.2NVMe技术实现高性能体验

U.2 NVMe全闪存储阵列日益成为全闪存储的主流&#xff0c;以Infortrend普安科技最新推出GS 5000U为例。作为GS 5000U系列首发机型&#xff0c;GS 5024UE全面升级&#xff0c;搭载第五代IntelXeon处理器&#xff0c;支持PCIe 5.0、NVMe-OF、100GbE&#xff0c;带宽性能比之前的旗…

cPanel如何远程MySQL

本周有一个客户&#xff0c;购买Hostease的HK Basic Linux虚拟主机&#xff0c;询问我们的在线客服&#xff0c;主机是否支持远程访问MySQL及如何配置的问题。我们为用户提供教程&#xff0c;用户很快完成了设置。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对您…

[2024]最新激活Navicat教程附激活码

PS&#xff1a;在开始前&#xff0c;建议先断开本地网络&#xff01;&#xff01;&#xff01;建议先断开本地网络&#xff01;&#xff01;&#xff01;建议先断开本地网络&#xff01;&#xff01;&#xff01; 1 安装 1.1 点击下一步 1.2 许可证选择“我同意”&#xff0c…

Fastgpt配合chatglm+m3e或ollama+m3e搭建个人知识库

概述&#xff1a; 人工智能大语言模型是近年来人工智能领域的一项重要技术&#xff0c;它的出现标志着自然语言处理领域的重大突破。这些模型利用深度学习和大规模数据训练&#xff0c;能够理解和生成人类语言&#xff0c;为各种应用场景提供了强大的文本处理能力。AI大语言模…

redis 数据迁移到rds2214(TongRDS-2.2.1.3.Load版 by lqw)

​ 文章目录 一.备份redis文件 vi redis.conf &#xff0c;看看有没有这两行设置&#xff0c;有的话改成跟下面的一致&#xff1a; appendonly yes appendfilename “appendonly.aof” 之后连接redis客户端&#xff0c;输入INFO persistence&#xff0c;如图所示即为开启成功…

云LIS系统源码,ASP.NET区域LIS系统源码,实验室信息系统

云LIS系统源码&#xff0c;ASP.NET区域LIS系统源码&#xff0c;实验室信息系统 LIS技术架构&#xff1a;ASP.NET CORE 3.1 MVC SQLserver Redis等 开发语言&#xff1a;C# 6.0、JavaScript 前端框架&#xff1a;JQuery、EasyUI、Bootstrap 后端框架&#xff1a;MVC、S…

在启动Windows安装的Nacos时报错

Please set the JAVA_HOME variable in your environm 有可能时jdk版本过低引起的&#xff0c;所以安装一个1.8版本以上的jdk 在安装jdk完成以后配置好环境变量&#xff0c;测试一下 winr打开控制台&#xff0c;输入&#xff1a; Java -version 出现如下情况说明jdk安装配置…

ELK+Filebeat日志分析系统

一、ELK基本介绍&#xff1a; 1.ELK 简介: ELK平台是一套完整的日志集中处理解决方案(日志系统)。 将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ELK --> ELFK --> ELFKMQ2.ELK组件介绍…

Android13 CameraServer启动流程

代码入口 frameworks/av/camera/cameraserver 里面包含了四个文件 我们先来看看Android.bp的内容 package {// See: http://go/android-license-faq// A large-scale-change added default_applicable_licenses to import// all of the license_kinds from "frameworks_a…

青少年体能素质教育平台

一、项目背景与意义 随着社会的快速发展和人们生活水平的提高&#xff0c;青少年体能素质教育逐渐受到社会各界的广泛关注。体能素质作为青少年全面发展的重要组成部分&#xff0c;对于提升他们的健康水平、增强自信心、培养团队协作精神和创新能力具有重要意义。然而&#xf…

数据结构(七)——查找的基本概念

七、查找 7.1 查找的基本概念 7.1.1 基本概念 查找 —— 在数据集合中寻找满⾜某种条件的数据元素的过程称为查找 查找表&#xff08;查找结构&#xff09;—— ⽤于查找的数据集合称为查找表&#xff0c;它由同⼀类型的数据元素&#xff08;或记录&#xff09;组成 关键字 …

网络流量分析与控制

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计5477字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

蓝桥杯——与或异或

题目 分析 很明显的DFS题&#xff0c;这里关键要找到边界&#xff0c;即x与y的关系&#xff0c;容易知道y<4-x&#xff0c;小于和等于是不同的搜索&#xff0c;小于的话就在同一行搜索&#xff0c;从下一列搜索&#xff0c;等于的话就从下一行的第一个搜索。 代码 num[[0…

ChatGPT 人工智能助手为你定制测试计划,精准又高效!

简介 测试计划是指描述了要进行的测试活动的范围、方法、资源和进度的文档。它主要包括测试项、被测特性、测试任务、谁执行任务和风险控制等。 所以在使用ChatGPT输出结果之前&#xff0c;我们需要先将文档的内容框架梳理好&#xff0c;以及将内容范围划定好&#xff0c;必要…

基于SpringBoot+Vue的咖啡商城(带文档)

项目介绍: 基于SpringBootVue的咖啡商城&#xff08;带文档&#xff09; 网上咖啡商城系统&#xff0c;咖啡商城系统 前后端分离&#xff0c;Java开发&#xff0c;Vue框架&#xff0c;Redis分布式缓存&#xff0c;MyBatis 运行环境&#xff1a;JDK1.8MySQLMavenRedisNode.js 项…