LeetCode---392周赛

news2025/1/13 15:35:03

题目列表

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;
    }
};

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

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

相关文章

Harmony鸿蒙南向外设驱动开发-Codec

功能简介 OpenHarmony Codec HDI&#xff08;Hardware Device Interface&#xff09;驱动框架基于OpenMax实现了视频硬件编解码驱动&#xff0c;提供Codec基础能力接口给上层媒体服务调用&#xff0c;包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

数据分析python代码——数据填充

在Python中&#xff0c;我们通常使用pandas库来处理和分析数据。数据填充是数据预处理的一个重要步骤&#xff0c;用于处理数据中的缺失值。以下是使用pandas库进行数据填充的示例代码&#xff1a; 在数据分析中&#xff0c;处理缺失值&#xff08;空值&#xff09;是一个重要…

Failed to load dll

Unity运行时提示 dll 加载失败 Plugins: Failed to load ‘Assets/Plugins/xxx.dll’ because one or more of its dependencies could not be loaded. 使用 Dependency Walker 查看这个 dll 引用&#xff0c;一推引用丢失 最后确认是 C 组件缺失 打开 Visual Studio Install…

kafka的概念以及Zookeeper集群 + Kafka集群 +elk集群

准备 3 台服务器做 Zookeeper 集群 192.168.68.5 192.168.68.6 192.168.68.7 安装前准备 //关闭防火墙 systemctl stop firewalld systemctl disable firewalld setenforce 0 node1服务器&#xff1a; vim zoo.cfg tickTime2000 #通信心跳时间&#xff0c;Zookeeper服务…

2024 年 AI代码助手AI Coding Assistant智能工具

AI代码助手&#xff08;AI Coding Assistant&#xff09;是一种利用人工智能帮助开发人员更快、更准确地编写代码的软件工具。 它可以通过根据提示生成代码或在你实时编写代码时建议自动完成代码来实现此目的。 以下是AI代码助手可以做的一些事情&#xff1a; 与你使用的流行代…

光伏电站运维管理系统功能全面详解

一、系统概述 光伏电站运维管理系统是一款专为光伏电站设计的综合性管理平台。该系统集成了先进的数据监测、故障诊断、运维任务管理、设备信息管理、用户权限管理以及系统维护与升级等功能&#xff0c;旨在提供全面、高效、智能的光伏电站运维服务&#xff0c;确保电站安全、…

【Next】错误处理和并行路由

错误处理 error.tsx 文件约定处理 嵌套路由 中意外的运行时错误。将错误隔离到受影响的段&#xff0c;同时保持应用的其余部分正常运行。 app/dashboard/error.tsx use client export default function Error({error,reset}: {error: Error,reset: () > void }) {return …

2024妈妈杯数学建模B题思路-甲骨文智能识别中原始拓片单字自动分割与识别研究

# 1 赛题 B 题 甲骨文智能识别中原始拓片单字自动分割与识别研究 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻在龟甲或 兽骨上的古老文字。甲骨文具有极其重要的研究价值&#xff0c;不仅对中国文明的 起源具有重要意义&#xff0c;也对世界文明的研究有着…

Arduino 项目笔记 |TH1621 LCD液晶显示屏驱动(SSOP-24封装)

LCD液晶屏资料 LCD液晶屏资料 重要参数&#xff1a; 工作电压&#xff1a; 3V可视角度&#xff1a;1201/4 &#xff0c;1/3 TH1621 驱动 HT1621 LCD控制驱动芯片介绍 VLCD 和 VCC 电压符合规格书&#xff0c;最好都取3.3V 。电压太高或太低都会出现段码液晶屏乱码的情况&am…

算法学习 | day40/60 单词拆分/多重背包/背包问题总结

一、题目打卡 1.1 单词拆分 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool findInVector(vector<string> &w, string& s){for(auto & it : w){if(it s) return true;}return false;}bool wordBreak(string …

第三十八节 Java 多线程编程

Java 给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程&#xff0c;并且每个线程定义了一个独立的执行路径。 多线程是多任务的一种特别的形式。多线程比多任务需要更小的开销。 这里定义和线程相关的另一个术语&…

第三十七节 Java 发送邮件

Java 发送邮件 使用Java应用程序发送E-mail十分简单&#xff0c;但是首先你应该在你的机器上安装JavaMail API 和Java Activation Framework (JAF) 。 你可以在 JavaMail (Version 1.2) 下载最新的版本。 你可以再 在JAF (Version 1.1.1)下载最新的版本。 下载并解压这些文…

云HIS系统操作指南

医疗(医院&#xff09;机构正式使用云HIS系统之前&#xff0c;要先进行院内基础数据的配置&#xff0c; 主要在数据管理模块中进行&#xff0c;由系统管理员来操作。 机构信息&#xff1a;主要是记录医院的基本信息和机构信息。 科室管理&#xff1a;是用来管理医疗&#xff08…

基于SSM的校园生活管理系统设计与实现(内附设计LW + PPT+ 源码下载)

摘 要 随着现代化发展进程不断的加快&#xff0c;人们对于网络的接受程度越来越强&#xff0c;现在人们的生活与工作已经离不开网络的帮助。而网络在当下的学校中也已经非常的普及&#xff0c;现在各类学校的网络覆盖率已经接近于100%。基于互联网来实现对学校校内的教育、教…

c# wpf datagrid 简单试验

1.概要 datagrid 一个列表类的控件 2.代码 <Window x:Class"WpfApp2.Window3"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.mic…

Mac电脑安装蚁剑

1&#xff1a; github 下载源码和加载器&#xff1a;https://github.com/AntSwordProjectAntSwordProject GitHubAntSwordProject has 12 repositories available. Follow their code on GitHub.https://github.com/AntSwordProject 以该图为主页面&#xff1a;antSword为源码…

go语言学习--3.常用语句

目录 1.条件语句 1.1 if语句 1.2 if-else语句 1.3 switch语句 1.4 select语句 2.循环语句 2.1循环处理语句 2.2循环控制语句 3.go语言关键字 1.条件语句 和c语言类似&#xff0c;相关的条件语句如下表所示&#xff1a; 1.1 if语句 if 布尔表达式 {/* 在布尔表达式为 t…

软考 — 系统架构设计师 - 嵌入式真题

问题1&#xff1a; 可靠度表示系统在规定条件下&#xff0c;规定的时间内不发生失效的概率。 失效率表示系统运行到此时从未出现失效的情况下&#xff0c;单位时间内系统出现失效的概率 问题 2&#xff1a; 动态冗余又称为主动冗余&#xff0c;通过故障检测&#xff0c;故障定…

[大模型]Qwen1.5-4B-Chat WebDemo 部署

Qwen1.5-4B-Chat WebDemo 部署 Qwen1.5 介绍 Qwen1.5 是 Qwen2 的测试版&#xff0c;Qwen1.5 是基于 transformer 的 decoder-only 语言模型&#xff0c;已在大量数据上进行了预训练。与之前发布的 Qwen 相比&#xff0c;Qwen1.5 的改进包括 6 种模型大小&#xff0c;包括 0.…

【服务器部署篇】Linux下JDK的安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…