LeetCode---377周赛---Floyd算法+字典树

题目列表

2974. 最小数字游戏

2975. 移除栅栏得到的正方形田地的最大面积

2976. 转换字符串的最小成本 I

2977. 转换字符串的最小成本 II

一、最小数字游戏

这题看懂题意就好,可以结合示例模拟一下,你就会发现规律,本质就是将数组排序,然后将相邻两个数字交换一下即可

代码如下

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

 二、移除栏杆得到的正方形田地的最大面积

这题就是单纯暴力求解两个栏杆之间的距离,代码如下

class Solution {
public:unordered_set<int> f(vector<int>&a,int mx){a.push_back(1);a.push_back(mx);sort(a.begin(),a.end());unordered_set<int>s;for(int i=0;i<a.size();i++){for(int j=i+1;j<a.size();j++){s.insert(a[j]-a[i]);}}return s;}int maximizeSquareArea(int m, int n, vector<int>& hFences, vector<int>& vFences) {auto h=f(hFences,m);auto v=f(vFences,n);int ans=0;for(auto x:h){if(v.count(x))ans=max(ans,x);}return ans?1LL*ans*ans%1000000007:-1;}
};

 三、转换字符串的最小成本I

这题的关键是你的看出来这是求全源最短路问题,题目要求将source变成target的最小成本,也就是字符之间的相互转换的代价最小,同时,题目允许出现一个字符到另一个字符中间有其他"中转站"的情况,很明显在考Floyd算法,代码如下

class Solution {
public:long long minimumCost(string source, string target, vector<char>& original, vector<char>& changed, vector<int>& cost) {map<pair<char,char>,int>mp;int n=source.size();int m=original.size();vector<vector<int>>g(26,vector<int>(26,-1));for(int i=0;i<m;i++){int x=original[i]-'a';int y=changed[i]-'a';if(g[x][y]==-1) g[x][y]=cost[i];else g[x][y]=min(g[x][y],cost[i]);}//Floyd算法for(int k=0;k<26;k++){for(int i=0;i<26;i++){for(int j=0;j<26;j++){if(g[i][k]!=-1&&g[k][j]!=-1){if(g[i][j]==-1) g[i][j]=g[i][k]+g[k][j];else g[i][j]=min(g[i][k]+g[k][j],g[i][j]);}}}}long long ans=0;for(int i=0;i<n;i++){if(source[i]!=target[i]){int x=source[i]-'a';int y=target[i]-'a';                if(g[x][y]!=-1) ans+=g[x][y];else return -1;}}return ans;}
};

四、转换字符串的最小成本II

这题和上一题一样,只是重字符之间的转化,改成了字符串之间的转换,我们依旧是用Floyd算法,但问题是我们如何标识和处理字符串,这里要用到字典树(208. 实现 Trie (前缀树) 标准的字典树模型,不认识的可以先去写这道题)。

同时,这题还需要用到dp,而且题目都帮我们降低难度了,说我们每次修改的区域不能出现重合。

状态定义为dp[i]表示以i为起始位置的字符串从source变成target的最小代价

dp[i]=min( dp[j] + g[i][j] ) 前提是区间[i,j]内的source字符串能变成target对应部分的字符串

代码如下

struct Node{Node*child[26]={0};int sid=-1;//用来标识字符串,表示以该结点为结尾的字符串序号
};class Solution {
public:long long minimumCost(string source, string target, vector<string>& original, vector<string>& changed, vector<int>& cost) {Node*root=new Node();int sid=0;//字典树function<int(string)>put=[&](string s)->int{ Node*node=root;for(auto e:s){int x=e-'a';if(node->child[x]==nullptr)node->child[x]=new Node();node=node->child[x];}if(node->sid==-1)node->sid=sid++;return node->sid;};int n=original.size();vector<vector<int>>g(2*n,vector<int>(2*n,-1));for(int i=0;i<n;i++){int x=put(original[i]);int y=put(changed[i]);if(g[x][y]!=-1) g[x][y]=min(g[x][y],cost[i]);else g[x][y]=cost[i];}for(int k=0;k<sid;k++){for(int i=0;i<sid;i++){if(g[i][k]==-1) continue;//这行代码能进一步优化时间for(int j=0;j<sid;j++){if(g[k][j]!=-1){if(g[i][j]==-1) g[i][j]=g[i][k]+g[k][j];else g[i][j]=min(g[i][j],g[i][k]+g[k][j]);}}}}int m=source.size();//递归写法// vector<long long>memo(m,-1);// function<long long(int)>dfs=[&](int i)->long long{//     if(i>=m) return 0;//     auto& res=memo[i];//     if(res!=-1) return res;//     res=LLONG_MAX/2;//     if(source[i]==target[i])//不要改//         res=dfs(i+1);//     Node*q=root,*p=root;//     for(int j=i;j<m;j++){//         q=q->child[source[j]-'a'];//         p=p->child[target[j]-'a'];//         if(q==nullptr||p==nullptr)//             break;//         if(q->sid<0||p->sid<0)//             continue;//         int d=g[q->sid][p->sid];//         if(d!=-1)//             res=min(res,dfs(j+1)+d);//     }//     return res;// };// long long ans = dfs(0);// return ans < LLONG_MAX / 2 ? ans : -1;//递推写法vector<long long>dp(m+1);for(int i=m-1;i>=0;i--){long long res=LLONG_MAX/2;if(source[i]==target[i])//不要改res=dp[i+1];Node*q=root,*p=root;for(int j=i;j<m;j++){q=q->child[source[j]-'a'];p=p->child[target[j]-'a'];if(q==nullptr||p==nullptr)break;if(q->sid<0||p->sid<0)continue;int d=g[q->sid][p->sid];if(d!=-1)res=min(res,dp[j+1]+d);}dp[i]=res;}return dp[0]<LLONG_MAX/2?dp[0]:-1;}
};

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

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

相关文章

后端程序员React初接触1

后端程序员React初接触 学习react基础与相关库的使用学习 包括react基础 路由 组件库等等 react是用于构建用户界面的JavaScript库 发送请求获取数据处理数据操作dom呈现页面&#xff08;react帮忙操作dom&#xff09; 数据渲染为视图 有facebook打造并开源 解决的问题 dom操…

Java 动态树的实现思路分析

Java 动态树的实现 目录概述需求&#xff1a; 设计思路实现思路分析1. 简单Java实现&#xff1a;2.建立父子表存储3.前端的对应的json 字符串方式 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0…

力扣:63. 不同路径 II(动态规划)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那…

SVN下载安装(服务器与客户端)

1.下载 服务器下载&#xff1a;Download | VisualSVN Server 客户端下载&#xff1a;自行查找 2. 服务器安装 双击执行 运行 下一步 同意下一步 下一步 选中安装目录 3. 客户端安装 双击执行 下一步 4. 服务器创建仓库 5. 服务器创建用户 6. 客户端获取资源 文件夹右键

用idea跑起十多年前的项目

一、eclipse的项目 先删掉一些eclipse的配置文件 二、在idea中导入项目 1、导入成功后&#xff0c;先【锤一下】 2、然后发现编译不通过&#xff0c;非常多的报错信息&#xff0c;逐一解决报错 &#xff08;1&#xff09;tomcat7配置报错 &#xff08;2&#xff09;先删除tom…

java springboot将接口查询数据放在系统中 一小时系统更新一次 避免用户访问接口查询数据库缓慢

真到了公司 很多数据库表 特别是常用的功能业务对应的 都是几百万条起步的数据 查询会比较缓慢 那么 我们就可以不用每次都真的查询数据库 例如 我这里有一个接口 通过 封装的 IBookService.list 函数去查询数据库 接口返回是这样的 我们先在启动类 条件装配上 这个接口所在的…

vivado CDC约束-“设置总线倾斜”对话框

“设置总线倾斜”对话框 在AMD Vivado™ IDE中&#xff0c;可以通过多种方式设置总线偏斜约束&#xff1a; •通过时间约束编辑器。选择窗口 → 时间限制 → 断言 → 设置总线倾斜。从“时序约束编辑器”中&#xff0c;可以添加、删除或修改总线扭曲约束。 注意&#…

day11--java高级编程:反射

4 Day18–反射 本章专题与脉络 1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中&#xff0c;所有的对象都有两种类型&#xff1a;编译时类型和运行时类型&#xff0c;而很多时候对象的编译时类型和运行时类型不一致&#xff08;多态&#xff09;。 Object obj n…

【AIGC科技展望】预测AIGC2025年的机会与挑战

2025年&#xff0c;AIGC的机会与挑战 在未来的五年里&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;将会成为一个越来越重要的领域。但是&#xff0c;伴随着机会而来的是挑战。在这篇文章中&#xff0c;我们将一起探讨AIGC的机会与挑战&#xff0c;并预测2025…

机器学习系列13:通过随机森林获取特征重要性

我们已经知道通过 L1 正则化和 SBS 算法可以用来做特征选择。 我们还可以通过随机森林从数据集中选择相关的特征。随机森林里面包含了多棵决策树&#xff0c;我们可以通过计算特征在每棵决策树决策过程中所产生的的信息增益平均值来衡量该特征的重要性。 你可能需要参考&…

【Spring实战】12 Thymeleaf

文章目录 1. 定义2. 设计目标3. 官网4. Spring 集成 Thymeleaf1&#xff09;添加依赖2&#xff09;创建模版3&#xff09;创建Controller4&#xff09;启动程序5&#xff09;执行验证 5. 代码详细总结 1. 定义 Thymeleaf 是一个用于在 Web 应用程序中进行服务器端 Java 模板渲…

Git:远程仓库的使用

查看当前的远程库 要查看当前配置有哪些远程仓库&#xff0c;可以用git remote 命令&#xff0c;它会列出每个远程库的简短名字。在克隆完某个项目后&#xff0c;至少可以看到一个名为origin 的远程库&#xff0c;Git 默认使用这个名字来标识你所克隆的原始仓库&#xff1a; 也…

UE4运用C++和框架开发坦克大战教程笔记(十三)(第40~42集)

UE4运用C和框架开发坦克大战教程笔记&#xff08;十三&#xff09;&#xff08;第40~42集&#xff09; 40. 多按键绑定41. 自动生成对象42. 资源模块数据结构测试自动生成对象按资源类型生成对象 40. 多按键绑定 上节课实现了按键绑定系统的 4 种基础绑定&#xff0c;这节课来…

python+django高校教材共享管理系统PyCharm 项目

本中原工学院教材共享平台采用的数据库是mysql&#xff0c;使用nodejs技术开发。在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。系统所要实现的功能分析&#xff0c;对于现在网络方便的管理&…

Java:IO流——字节流和字符流

目录 IO流的基本概念 IO流体系结构 FileOutputStream字节输出流 构造方法 成员方法 细节 关流 FileInputStream字节输入流 构造方法及成员方法 read不带参数代码示例 read带参数代码示例​编辑 将字节数组或字符数组转成字符串 FileReader 字符输入流 构造方法和…

在macOS中搭建.NET MAUI开发环境

文章目录 准备安装扩展安装 .NET安装工作负载安装 Xcode 命令行工具调试安卓应用安装 JDK安装 Android SDK 安装 Android 模拟器安装模拟器安装镜像创建虚拟机 同意许可条款创建 MAUI 项目调试 MAUI 应用切换调试目标 参考资料 准备 一台 macOS Monterey 以上的电脑安装 XCode…

分类模型评估方法

1.数据集划分 1.1 为什么要划分数据集? 思考&#xff1a;我们有以下场景&#xff1a; 将所有的数据都作为训练数据&#xff0c;训练出一个模型直接上线预测 每当得到一个新的数据&#xff0c;则计算新数据到训练数据的距离&#xff0c;预测得到新数据的类别 存在问题&…

番茄台式电脑装机日记

番茄台式电脑装机日记 start 时至今日&#xff0c;终于圆了年少时的梦&#xff1a;拥有自己的一台台式电脑。就好像第一次学会系鞋带&#xff0c;第一次剥榴莲&#xff0c;亲手组装自己的第一台台式电脑&#xff0c;这个体验完全是此生少有且独特的完美体验。作者&#xff1a…

Docker单点部署Seata(2.0.0) + Nacos(v2.3.0) + Mysql(5.7)

文章目录 一、部署Nacos二、部署Mysql三、Seata准备工作1. 记住nacos、mysql、宿主机的ip2. 建立数据库3. Nacos远程配置文件 四、部署Seata五、初步检验Seata部署情况六、微服务使用Seata1.引入依赖2. application.yml配置 七、遇到的坑1. Nacos显示Seata服务的ip为容器内网ip…

使用SpringBoot AOP记录操作日志和异常日志

使用SpringBoot AOP记录操作日志和异常日志 平时我们在做项目时经常需要对一些重要功能操作记录日志&#xff0c;方便以后跟踪是谁在操作此功能&#xff1b;我们在操作某些功 能时也有可能会发生异常&#xff0c;但是每次发生异常要定位原因我们都要到服务器去查询日志才能找…