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;。 现在考虑网格中有障碍物。那…

推荐的 Web 性能计时:多长时间才算太长?

对于加载页面时的缓慢速度没有明确的规定&#xff0c;但有具体的指导原则来指示内容将加载&#xff08;1 秒&#xff09;、空闲&#xff08;50 毫秒&#xff09;、动画&#xff08;16.7 毫秒&#xff09;和响应用户输入&#xff08;50 到 50 毫秒&#xff09;。 200 毫秒&#…

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;可以添加、删除或修改总线扭曲约束。 注意&#…

【C++】循环结构中的变量的生命周期

在C中&#xff0c;循环结构中变量的生命周期取决于变量的作用域和声明位置。 for(int i 0; i < 5; i) //i为循环变量&#xff0c;在循环结构刚开始时被创建&#xff0c;在整个循环结构结束时被销毁 {int x i; // x为循环体中的变量&#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…

uniapp获取用户头像

在uniapp中&#xff0c;你可以使用uni.getUserInfo方法来获取用户的头像信息&#xff0c;具体步骤如下&#xff1a; 在需要获取用户头像的页面中&#xff0c;引入uni-app的API&#xff1a;import uni from dcloudio/uni-app; 在需要的地方调用uni.getUserInfo方法来获取用户的…

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

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

使用官网Spring Initializr创建一个满足您需求的Spring Boot项目,包括建议目录配置

为了创建一个满足您需求的Spring Boot项目&#xff0c;我们将在https://start.spring.io/Spring Initializr中选择合适的依赖。以下是基于您的描述所推荐的依赖项&#xff1a; Spring Web&#xff1a;用于开发RESTful API。Spring Data JPA&#xff08;但排除Spring Boot默认数…

Mybatis-Plus使用小记

MP 使用小记 所谓 MP 是指&#xff1a;Mybatis-Plus 前言 本篇文章是对 MP 一些日常开发学习中不常见但实用的使用小技巧总结&#xff0c;内容将持续更新&#xff0c;希望能对小伙伴们有所帮助。推荐点赞 收藏哦&#xff01; 官方文档&#xff1a;Mybatis-Plus 给现有分页指…

Activemq性能优化

生产者流量限制 ActiveMQ支持为每个生产者单独设置流量控制。流量控制的含义&#xff1a;当生产者产生消息过快&#xff0c;超过流量限制的时候&#xff0c;生产者将会被阻塞直到资源可以继续使用&#xff0c;或者抛出一个JMSException。 同步发送消息&#xff08;useAsynSen…

力扣:509. 斐波那契数(动态规划,附带递归版本) 详细讲解动态规划的思路

题目&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中…

速盾cdn:cdn加速原理是什么

CDN&#xff08;内容分发网络&#xff09;通过在全球各地部署服务器节点来加速内容传输&#xff0c;提高用户访问网站时的响应速度和性能。速盾CDN作为一种CDN服务提供商&#xff0c;其加速原理主要涉及以下几个关键步骤&#xff1a; 内容缓存&#xff1a; 当用户访问一个网站时…

【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; 也…