Leetcode - 周赛394

目录

一,3120. 统计特殊字母的数量 I

二,3121. 统计特殊字母的数量 II

三,3122. 使矩阵满足条件的最少操作次数

四,3123. 最短路径中的边


一,3120. 统计特殊字母的数量 I

本题就是统计有多少个字母的大小写同时出现在字符串word中,分别使用一个数组来统计大写字母和小写字母的出现次数。 

代码如下: 

class Solution {public int numberOfSpecialChars(String word) {int[] cnt1 = new int[26];//大写int[] cnt2 = new int[26];//小写for(char ch : word.toCharArray()){if(Character.isUpperCase(ch)){cnt1[ch-'A']++;}else{cnt2[ch-'a']++;}}int ans = 0;for(int i=0; i<26; i++){if(cnt1[i]>0 && cnt2[i]>0)ans++;}return ans;}
}

二,3121. 统计特殊字母的数量 II

本题比上一题多了一些条件,不仅要大小写都出现,并且所有的小写字母都要出现在其对应大写字母的前面。所以可以使用两个数组分别存储,一个存储大写字母的第一次出现下标,另一个存储小写字母最后一次出现下标,如果大小写都出现&小写字母的下标<大写字母的下标,那么就+1。

代码如下:

class Solution {public int numberOfSpecialChars(String word) {int[] idx1 = new int[26];//大写字母第一次出现的下标int[] idx2 = new int[26];//小写字母最后一次出现的下标Arrays.fill(idx1, -1);Arrays.fill(idx2, -1);char[] ch = word.toCharArray();for(int i=0; i<ch.length; i++){if(Character.isLowerCase(ch[i])){idx2[ch[i]-'a'] = i;}else{idx1[ch[i]-'A'] = idx1[ch[i]-'A']==-1?i:idx1[ch[i]-'A'];}}int ans = 0;for(int i=0; i<26; i++){if(idx1[i]!=-1&&idx2[i]!=-1&&idx1[i]>idx2[i])ans++;}return ans;}
}

上述做法更加不容易出错,但是还有更加省时间的做法,可以一次遍历实现,使用一个hash表来统计出现的大小写字母,再使用一个数组 cnt 来统计 26 个字母的状态:

  • 0:该字母没有计入答案
  • 1:该字母已计入答案
  • 2:该字母不可能是答案

遍历该字符串:

  • 如果是大写字母,并且之前出现过小写字母,将cnt[i] = 0 (表示该字母没有被计入ans中),将cnt[i] = 1,ans++
  • 如果是小写字母,并且之前出现过大写字母&& cnt[i] == 1 (表示该字母已经被计入ans中),将cnt[i] = 2 (表示该字母不可能是答案),ans--
  • 如果是大写字母,并且之前没有出现过小写字母,将cnt[i]=2 (表示该字母不可能是答案),防止出现BbB这种情况
class Solution {public int numberOfSpecialChars(String word) {Set<Character> set = new HashSet<>();//统计大小写int[] cnt = new int[26];//0:该字母没有计入答案//1:该字母已计入答案//2:该字母被计入答案后又出现小写字母,又被删除int ans = 0;for(char ch : word.toCharArray()){if(Character.isUpperCase(ch)){//小写字母出现后大写字母出现的情况if(set.contains(Character.toLowerCase(ch)) && cnt[ch-'A']==0){cnt[ch-'A'] = 1;ans++;}//出现小写字母未出现,先出现大写字母的情况!!!(容易忽略)if(!set.contains(Character.toLowerCase(ch))){cnt[ch-'A'] = 2;}}else{//出现大写字母后,又出现小写字母的情况if(set.contains(Character.toUpperCase(ch)) && cnt[ch-'a']==1){cnt[ch-'a'] = 2;ans--;}}set.add(ch);}return ans;}
}

三,3122. 使矩阵满足条件的最少操作次数

没有思路,先考虑暴力求解,也就是枚举每一列选择保留的数字,保证相邻两列保留的数不一样,求保留的最大值,所以 dfs 就需要两个变量,一个存储当前的列数,一个存储上一个保留的数字。

dfs(i,pre) 的定义:前 i 列数可以保留的最大数目。

  • 结束条件:i < 0,返回 0
  • 每次递归要做:使用 j 遍历0~9,res = Math.max( res,dfs(i-1,j)+cnt[ i ][ j ]),cnt[ i ][ j ]表示当前列中有多少个 j 
  • 结果: res
class Solution {Map<String, Integer> map = new HashMap<>();public int minimumOperations(int[][] grid) {int n = grid.length;int m = grid[0].length;int[][] cnt = new int[m][10];for(int i=0; i<n; i++){for(int j=0; j<m; j++){cnt[j][grid[i][j]]++;}}return n*m - dfs(m-1, cnt, -1);}int dfs(int i, int[][] cnt, int pre){String key = i + "-" + pre;if(!map.isEmpty() && map.containsKey(key))return map.get(key);if(i < 0) return 0;int res = 0;for(int j=0; j<=9; j++){if(j != pre)res = Math.max(res, dfs(i-1, cnt, j)+cnt[i][j]);}map.put(key, res);return res;}
}

四,3123. 最短路径中的边

本题和上周双周赛一样,考的还是djstra算法,只不过它问的是edges[i]是否在0->n-1节点的最短路径上,这里有两种做法,先讲简单一点的:

使用两次djstra算法,分别算出从0到所有位置的最短路径dis1,以及从n-1到所有位置的最短路径dis2,再遍历edges数组(x=e[0],y=e[1],w=e[2]),判断 dis1[x] + dis2[y] + w == dis1[n-1] 或者 dis1[y] + dis2[x] + w == dis1[n-1],如果相等说明ans[i] = true,否则 ans[i] = false。就是下图两种情况:

代码如下:

class Solution {int n;public boolean[] findAnswer(int n, int[][] edges) {this.n = n;List<int[]>[] g = new ArrayList[n];Arrays.setAll(g, e->new ArrayList<>());for(int i=0; i<edges.length; i++){int[] e = edges[i];int x = e[0], y = e[1], w = e[2];g[x].add(new int[]{y, w});g[y].add(new int[]{x, w});} int[] dis1 = dis(g, 0);//0->?的最短路径int[] dis2 = dis(g, n-1);//n-1 -> ?的最短路径int mn = dis1[n-1];boolean[] ans = new boolean[edges.length];for(int i=0; i<edges.length; i++){int[] e = edges[i];int x = e[0], y = e[1], w = e[2];if(dis1[x] + dis2[y] + w == mn || dis1[y]+dis2[x]+w==mn){ans[i] = true;}else{ans[i] = false;}}return ans;}int[] dis(List<int[]>[] g, int s){int[] dis = new int[n];Arrays.fill(dis, Integer.MAX_VALUE/2);dis[s] = 0;PriorityQueue<int[]> que = new PriorityQueue<>((x,y)->x[0]-y[0]);que.offer(new int[]{0, s});while(!que.isEmpty()){int[] t = que.poll();int dx = t[0];int x = t[1];if(dx > dis[x]){continue;}for(int[] y : g[x]){int idx = y[0];int newDis = dx + y[1];if(dis[idx]==Integer.MAX_VALUE/2 || newDis < dis[idx]){dis[idx] = newDis;que.offer(new int[]{newDis,idx});}}}return dis;}
}

另一种解法和上述解法的思路是相同的,但是时间复杂度更低,只使用一次djstra算法,算出从0到所有位置的最短路径dis,然后从n-1出发,倒着dfs,如果dis[y] + w == dis[x],就说明当前x-y这段路径在最短路径上。

代码如下:

class Solution {public boolean[] findAnswer(int n, int[][] edges) {List<int[]>[] g = new ArrayList[n];Arrays.setAll(g, e->new ArrayList<>());for(int i=0; i<edges.length; i++){int[] e = edges[i];int x = e[0], y = e[1], w = e[2];g[x].add(new int[]{y, w, i});g[y].add(new int[]{x, w, i});}PriorityQueue<int[]> que = new PriorityQueue<>((x,y)->x[0]-y[0]);que.offer(new int[]{0, 0});int[] dis = new int[n];Arrays.fill(dis, Integer.MAX_VALUE/2);dis[0] = 0;while(!que.isEmpty()){int[] t = que.poll();int dx = t[0];int x = t[1];if(dx > dis[x]) continue;for(int[] y : g[x]){int idx = y[0];int newDis = dx + y[1];if(dis[idx]==Integer.MAX_VALUE/2 || newDis < dis[idx]){dis[idx] = newDis;que.offer(new int[]{newDis, idx});}}}boolean[] ans = new boolean[edges.length];if(dis[n-1] == Integer.MAX_VALUE/2) return ans;boolean[] vis = new boolean[n];dfs(n-1, dis, ans, vis, g);return ans;}void dfs(int x, int[] dis, boolean[] ans, boolean[] vis, List<int[]>[] g){vis[x] = true;for(int[] t : g[x]){int y = t[0], w = t[1], i = t[2];if(dis[y] + w != dis[x])continue;ans[i] = true;if(!vis[y]){dfs(y, dis, ans, vis, g);}}}
}

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

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

相关文章

Kimi Chat四大更新详细解读!模型能力提升,支持语音输入输出!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

SpringBoot集成Sharding-JDBC实现主从同步

SpringBoot集成Sharding-JDBC实现主从同步 1.mysql主从配置2.application.properties文件配置3.测试3.1 查询数据3.2 添加数据 1.mysql主从配置 详细内容请参考上一篇文章&#xff1a;MySQL8.0以上实现主从同步配置 2.application.properties文件配置 # ShardingSphere conf…

阿斯达年代记怎么下载 阿斯达年代记三强争霸下载教程

阿斯达年代记怎么下载 阿斯达年代记三强争霸下载教程 阿斯达年代记是一款三国争霸类型的游戏&#xff0c;在游戏中大家可以体验到三权争霸的刺激场景&#xff0c;在战场中大家不仅可以体验到体验到文化交织还可以感受到战场的残酷&#xff0c;本期小编将会给大家带来阿斯达年代…

基于vue+node+mysql的视频校对系统

一、登录注册&#xff1a;包括登录&#xff0c;注册&#xff0c;忘记密码&#xff0c;验证码等常用点。 二、用户管理&#xff1a;包括用户的增删改查 三、权限管理&#xff08;请增加这个权限&#xff1a;任务分配——只有管理者才能发布和删除任务&#xff1b;管理员设置。 四…

R语言绘制动态网络图Network教程WGCNA

今天分享的笔记是使用NetworkD3对WGCNA的共表达网络进行可视化&#xff0c;创建交互式动态网络图&#xff0c;展示基因之间的相互关系&#xff0c;可以用于转录组或者其他调控网络展示。 加权基因共表达网络分析 (WGCNA, Weighted correlation network analysis)是用来描述不同…

MQTT服务器EMQX的安装和使用(Windows)

一、下载地址&#xff1a; 下载 EMQX 二、安装环境&#xff1a; Windows Server2016 16G 500G 三、启动服务&#xff1a; 下载文件解压后放入以下目录&#xff08;注意&#xff0c;目录名一定是英文&#xff0c;否则会造成启动不成功&#xff01;&#xff09;&#xff1a…

mybatis与mybatisplus

mybatis 基本使用 整合springboot 1.添加依赖 2.添加配置 spring:# 数据源相关配置datasource:username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver#时区必须配置否则报错,注意数据库名切换为自己的数据库名称url: jdbc:mysql://127.0.0.1/ithei…

论文略读:OpenGraph: Towards Open Graph Foundation Models

arxiv 2023 1 intro Graph大模型希望OpenGraph能够捕捉通用的拓扑结构模式&#xff0c;对测试数据进行Zero-shot预测 仅通过前向传播过程&#xff0c;就可以对测试图数据进行高效的特征提取和准确预测模型的训练过程在完全不同的图数据上进行&#xff0c;在训练阶段不接触测试…

【2024年5月备考新增】】软考极限冲刺 《项目质量管理1》

1 知识点 1.1 质量成本 一致性成本 项目花费资金规避失败 预防成本:(打造某种高质量产品) 培训文件过程设备完成时间评估成本:(评估成本) 测试破坏性试验损失检查非一致性成本 项目前后花费的资金(由于失败) 内部失败成本:(项目中发现的失败) 返工报废外部失败成本:…

windows安装nc命令的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

(mac)Prometheus监控之Node_exporter(CPU、内存、磁盘、网络等)

完整步骤 1.启动 Prometheus 普罗米修斯 prometheus --config.file/usr/local/etc/prometheus.yml 浏览器访问 http://localhost:9090/targets 2.启动Node_exporter node_exporter 访问&#xff1a;http://localhost:9100 3.启动grafana brew services start grafana 访问…

力扣146. LRU 缓存

Problem: 146. LRU 缓存 文章目录 题目描述思路复杂度Code 题目描述 思路 主要说明大致思路&#xff0c;具体实现看代码。 1.为了实现题目中的O(1)时间复杂度的get与put方法&#xff0c;我们利用哈希表和双链表的结合&#xff0c;将key作为键&#xff0c;对应的链表的节点作为…

2024年前端技术发展趋势

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

如何用idm下载迅雷文件 idm怎么安装到浏览器 idm怎么设置中文

如果不是vip用户使用迅雷下载数据文件&#xff0c;其下载速度是很慢的&#xff0c;有的时候还会被限速&#xff0c;所以很多小伙们就开始使用idm下载迅雷文件&#xff0c;idm这款软件最大的优势就是下载速度快&#xff0c;还有就是具备网页捕获功能&#xff0c;能够下载网页上的…

ESD+显示模组

ESD测试是指对消费电子设备进行静电放电测试&#xff0c;通常用于检查设备是否具有防静电能力&#xff0c;以及在正常使用过程中是否容易受到静电干扰&#xff0c;通过进行ESD测试&#xff0c;可以评估设备的抗静电能力&#xff0c;并采取相应的措施以提高设备的耐静电性能。 E…

小米汽车超级工厂智能物流

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 小米汽车超级工厂以其先进的智能物流系统&#xff0c;标志着汽车制造业在智能化和自动化方面迈出了重要一步。该工厂采用物联网(IoT)技术&#xff0c;实…

架构师系列-MYSQL调优(五)- JOIN、in及exists优化

JOIN算法原理 JOIN 是 MySQL 用来进行联表操作的&#xff0c;用来匹配两个表的数据&#xff0c;筛选并合并出符合我们要求的结果集。JOIN 操作有多种方式&#xff0c;取决于最终数据的合并效果。常用连接方式的有以下几种: 驱动表的定义 什么是驱动表 ? 多表关联查询时,第一…

Bert语言大模型基础

一、Bert整体模型架构 基础架构是transformer的encoder部分&#xff0c;bert使用多个encoder堆叠在一起。 主要分为三个部分&#xff1a;1、输入部分 2、注意力机制 3、前馈神经网络 bertbase使用12层encoder堆叠在一起&#xff0c;6个encoder堆叠在一起组成编码端&#xf…

Spring Boot中判断轨迹数据是否经过设置的打卡点,且在PGSQL中把点拼接成线,判断某个点是否在线上或在线的50米范围内

问题描述 轨迹数据判断是否经过打卡点&#xff0c;轨迹数据太多&#xff0c;循环判断的话非常消耗内存。解决办法只需要把所有轨迹数据点拼成了一条线&#xff0c;然后只需要循环打卡点即可&#xff0c;打卡点不多&#xff0c;一般不会超过100个&#xff0c;如果多的话&#x…

R可视化:桑基图展示数据层流动

介绍 以桑基图形式展示数据分布情况 加载R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE) library(tidyverse) library(ggalluvial)# rm(list = ls()) options(stringsAsFactors = F) options(future.globals.maxSize = 10000 * 1024^2) 导入数据 metadata…