Leetcode 第394场周赛 问题和解法

news2024/9/19 13:01:45

题目

统计特殊字母的数量 I

给你一个字符串word。如果word中同时存在某个字母的小写形式和大写形式,则称这个字母为特殊字母。

返回word中特殊字母的数量。

示例 1:

输入:word = "aaAbcBC"

输出:3

解释:

word 中的特殊字母是 'a''b''c'

解题思路

创建两个数组,如果对应字母有出现过就置为1,然后再判断即可。

class Solution {
    public int numberOfSpecialChars(String word) {
        int[]count=new int[26];
        int[]bigCount=new int[26];
        int len=word.length();
        for(char mid:word.toCharArray()){
            if (mid>='a'&&mid<='z'){
                count[mid-'a']=1;
            }
            if (mid>='A'&&mid<='Z'){
                bigCount[mid-'A']=1;
            }
        }
        int res=0;
        for(int i=0;i<26;i++){
            if (count[i]==1&&bigCount[i]==1){
                res++;
            }
        }
        
        return res;
    }
}

统计特殊字母的数量 II

给你一个字符串word。如果word中同时出现某个字母c的小写形式和大写形式,并且每个小写形式的c都出现在第一个大写形式的c之前,则称字母c是一个特殊字母。

返回word中特殊字母的数量。

示例 1:

输入:word = "aaAbcBC"

输出:3

解释:

特殊字母是 'a''b''c'

解题思路

本题是第一题的变种,针对小写字母需要统计出现下标最大的值;针对大写字母需要统计出现下标最小的值,然后依次判断即可。

class Solution {
    public int numberOfSpecialChars(String word) {
        int[]count=new int[26];
        Arrays.fill(count,Integer.MIN_VALUE);
        int[]bigCount=new int[26];
        Arrays.fill(bigCount,Integer.MAX_VALUE);
        int len=word.length();
        char[]ca=word.toCharArray();
        for(int i=0;i<len;i++){
             if (ca[i]>='a'&&ca[i]<='z'){
                count[ca[i]-'a']=Math.max(i,count[ca[i]-'a']);
            }
            if (ca[i]>='A'&&ca[i]<='Z'){
                bigCount[ca[i]-'A']=Math.min(i,bigCount[ca[i]-'A']);
            }
        }
        int res=0;
        for(int i=0;i<26;i++){
            
            if (count[i]<bigCount[i]&&count[i]!=Integer.MIN_VALUE&&bigCount[i]!=Integer.MAX_VALUE){
                res++;
            }
        }
        
        return res;
    }
}

使矩阵满足条件的最少操作次数

给你一个大小为mxn的二维矩形grid。每次操作中,你可以将任一格子的值修改为任意非负整数。完成所有操作后,你需要确保每个格子grid[i][j]的值满足:

  • 如果下面相邻格子存在的话,它们的值相等,也就是grid[i][j]==grid[i+1][j](如果存在)。
  • 如果右边相邻格子存在的话,它们的值不相等,也就是grid[i][j]!=grid[i][j+1](如果存在)。

请你返回需要的最少操作数目。

示例 1:

输入:grid = [[1,0,2],[1,0,2]]

输出:0

解释:矩阵中所有格子已经满足要求。

在这里插入图片描述

解题思路

1.创建一个二维数组count. count[i][j]代表第i列有多少个数字j
2.遍历grid填充count数组
3.创建一个result数组, result[i][j]代表当第i列全部为数字j, 并且第0列当第i列所有数据都满足矩阵条件需要花费的最少操作次数
4.初始化第一列, result[0][i] = n - count[0][i];
5.每一列都只依赖前一列, 当前列可以为0-9的任意一个数字, 前一列的数字只要和当前列的数字不一样即可
那么result[i][x] = Math.min(result[i][x], (n - count[i][x]) + result[i - 1][y]);
6.最后我们只要查看最后一列为0-9需要花费的操作次数, 选择最小的即可

class Solution {
    public int minimumOperations(int[][] grid) {
        int n = grid.length;
        int m = grid[0].length;
        
        int[][] count = new int[m][10];
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                count[j][grid[i][j]] += 1;
            }
        }
        
        int[][] result = new int[m][10];
        for(int i = 0; i < m; i++){
            Arrays.fill(result[i], 0x3f3f3f3f);
        }
        
        for(int i = 0; i <= 9; i++){
            result[0][i] = n - count[0][i];
        }
        
        for(int i = 1; i < m; i++){
            for(int x = 0; x <= 9; x++){
                for(int y = 0; y <= 9; y++){
                    if(x == y){
                        continue;
                    }
                    result[i][x] = Math.min(result[i][x], (n - count[i][x]) + result[i - 1][y]);
                }
            }
        }
        
        int finalResult = 0x3f3f3f3f;
        
        for(int i = 0; i <= 9; i++){
            finalResult = Math.min(finalResult, result[m - 1][i]);
        }
        
        return finalResult;
    }
   
}

最短路径中的边

给你一个n个节点的无向带权图,节点编号为0到n-1。图中总共有m条边,用二维数组edges表示,其中edges[i]=[ai,bi,wi]表示节点ai和bi之间有一条边权为wi的边。

对于节点0为出发点,节点n-1为结束点的所有最短路,你需要返回一个长度为m的boolean数组answer,如果edges[i]至少在其中一条最短路上,那么answer[i]为true,否则answer[i]为false。

请你返回数组answer。

注意,图可能不连通。

示例 1:

输入:n = 6, edges = [[0,1,4],[0,2,1],[1,3,2],[1,4,3],[1,5,1],[2,3,1],[3,5,3],[4,5,2]]

输出:[true,true,true,false,true,true,true,false]

解释:

以下为节点 0 出发到达节点 5 的 所有 最短路:

路径 0 -> 1 -> 5 :边权和为 4 + 1 = 5 。
路径 0 -> 2 -> 3 -> 5 :边权和为 1 + 1 + 3 = 5 。
路径 0 -> 2 -> 3 -> 1 -> 5 :边权和为 1 + 1 + 2 + 1 = 5

在这里插入图片描述

解题思路

首先用 Dijkstra 算法(堆优化版本)计算出起点0到所有节点的最短路长度dis.
如果 dis[n -1] = ∞,说明无法从起点0到终点n-1,答案全为false。
否则,我们可以从终点n-1出发,倒着 DFS 或 BFS,设当前在点y,邻居为x,边权为 w,如果满足dis[x] + w = dis[y]则说明 x-y 这条边在从0到n-1的最短路上。

class Solution {
    public boolean[] findAnswer(int n, int[][] edges) {
        List<int[]>[] g = new ArrayList[n];
        Arrays.setAll(g, i -> 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});
        }

        long[] dis = new long[n];
        Arrays.fill(dis, Long.MAX_VALUE);
        dis[0] = 0;
        PriorityQueue<long[]> pq = new PriorityQueue<>((a, b) -> Long.compare(a[0], b[0]));
        pq.offer(new long[]{0, 0});
        while (!pq.isEmpty()) {
            long[] dxPair = pq.poll();
            long dx = dxPair[0];
            int x = (int) dxPair[1];
            if (dx > dis[x]) {
                continue;
            }
            for (int[] t : g[x]) {
                int y = t[0];
                int w = t[1];
                long newDis = dx + w;
                if (newDis < dis[y]) {
                    dis[y] = newDis;
                    pq.offer(new long[]{newDis, y});
                }
            }
        }

        boolean[] ans = new boolean[edges.length];
        // 图不连通
        if (dis[n - 1] == Long.MAX_VALUE) {
            return ans;
        }

        // 从终点出发 BFS
        boolean[] vis = new boolean[n];
        dfs(n - 1, g, dis, ans, vis);
        return ans;
    }

    private void dfs(int y, List<int[]>[] g, long[] dis, boolean[] ans, boolean[] vis) {
        vis[y] = true;
        for (int[] t : g[y]) {
            int x = t[0];
            int w = t[1];
            int i = t[2];
            if (dis[x] + w != dis[y]) {
                continue;
            }
            ans[i] = true;
            if (!vis[x]) {
                dfs(x, g, dis, ans, vis);
            }
        }
    }
}

来源

LeetCode

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

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

相关文章

【Entity Framework】聊一聊EF如何使用数据库函数

【Entity Framework】聊一聊EF如何使用数据库函数 文章目录 【Entity Framework】聊一聊EF如何使用数据库函数一、数据库函数的类型二、内置函数与用户定义的函数四、聚合函数、标量函数和表值函数五、Niladic函数六、EF Core 中的数据库函数映射6.1 内置函数映射6.2 EF.Functi…

【iOS开发】(四)react Native第三方组件五个20240419-20

react native 外的 第三方组件 目录标题 react native 外的 第三方组件&#xff08;一&#xff09;与rn核心组件的使用步骤区别&#xff1a;&#xff08;二&#xff09;第三方组件概览1 WebView2 Picker3 Swiper4 AsyncStorage5 Geolocation6 Camera (三)详细学习1 WebViewCoco…

ROS1快速入门学习笔记 - 01Linux基础

目录 一、Linux极简基础 二、C与Python极简基础 1. for循环 2. while循环 3. 面向对象 一、Linux极简基础 终端快捷键&#xff1a;ctrlaltt 命令行的操作方式 查看当前终端所在路径&#xff1a;pwd切换路径cd&#xff1b;例如cd /home/ 进入home文件夹&#xff1b;cd …

Oracle Hint 语法详解

什么是Hint Hint 是 Oracle 提供的一种 SQL 语法&#xff0c;它允许用户在 SQL 语句中插入相关的语法&#xff0c;从而影响 SQL 的执行方式。 因为 Hint 的特殊作用&#xff0c;所以对于开发人员不应该在代码中使用它&#xff0c;Hint 更像是 Oracle 提供给 DBA 用来分析诊断问…

2024数学建模时间汇总与竞赛攻略

目录 2024数学建模汇总&#xff08;时间、报名费、获奖率、竞赛级别、是否可跨校&#xff09; 中国高校大数据挑战赛 “华数杯”国际大学生数学建模竞赛 美国大学生数学建模竞赛&#xff08;美赛&#xff09; 数学中国&#xff08;认证杯&#xff09;数学建模网络挑战赛 …

从国九条的颁布简单看待未来的因子轮动

上周4月12日《关于加强监管防范风险推动资本市场高质量发展的若干意见》又称国九条出台后&#xff0c;除了本周五中东局势对大盘的影响&#xff0c;本周一波三折的行情很大程度上都是围绕着国九条展开的。一个很有意思的现象是前两次国九条发布后&#xff0c;市场都诞生了波澜壮…

【Linux开发 第八篇】定时任务

定时任务 crond任务调度at定时任务 crond任务调度 任务调度&#xff1a; 是指系统在某个时间执行特定的命令或程序 任务调度分类&#xff1a; 系统工作&#xff1a;有些重要的工作必须周而复始地执行&#xff0c;如病毒扫描等 个别用户工作&#xff1a;个别用户可能希望执行某…

107页 | 企业数字化转型规划设计(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 【企业数字化转型规划设计】 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT解决方案&…

JAVA-服务器搭建-创建web后端项目

首先打开IDEA 点击新建项目 写好名称-模板选择 Web应用程序 -语言选择 Java 构建系统选择 Maven 然后点击下一步 选择版本-选择依赖项 Web Profile 点击创建 点击当前文件-选择编辑配置 选择左上角的加号-选择Tomcat服务器-选择本地 点击配置-选择到Tomcat目录-点击确定 起个…

Postman之安装

Postman工具之介绍与安装 Postman是什么&#xff1f;Postman有几种安装方式&#xff1f; Postman是什么&#xff1f; postman是一款http客户端的模拟器&#xff0c;它可以模拟发出各种各样的网络请求&#xff0c;用于接口测试。 Postman有几种安装方式&#xff1f; 两种&…

【数学建模】优劣解距离法Topsis模型(含MATLAB代码)

TOPSIS法&#xff0c;全称 Technique for Order Preference by Similarity to an Ideal Solution&#xff0c;是由C.L.Hwang和K.Yoon于1981年首次提出的 。这是一种多目标决策分析中常用的有效方法&#xff0c;也被称作优劣解距离法 。 TOPSIS法的基本原理是通过检测评价对象与…

Abaqus python二次开发2-扭转弹簧刚度计算

Abaqus python二次开发2-扭转弹簧刚度计算 1、定义弹簧参数2、绘制弹簧2.1、绘制弹簧截面2.12、绘制弹簧实体part&#xff08;螺旋旋转截面&#xff09; 3、设置材料、截面属性、并赋给弹簧&#xff08;set&#xff09;4、创建组件的坐标系、参考点和instance&#xff08;弹簧&…

政安晨:【Keras机器学习示例演绎】(五)—— 利用视觉变换器进行物体检测

目录 导言 导入和设置 准备数据集 实施多层感知器&#xff08;MLP&#xff09; 实施补丁创建层 显示输入图像的补丁 实施补丁编码层 构建 ViT 模型 运行实验 评估模型 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与…

4.9 启动系统任务❤❤❤

有一些特殊的任务需要在系统启动时执行&#xff0c;例如配置文件加载、数据库初始化等操作。 Spring Boot对此提供了两种解决方案&#xff1a;CommandLineRunner和ApplicationRunner。 CommandLineRunner和ApplicationRunner基本一致&#xff0c;差别主要体现在参数上。 1. Co…

【Linux】在centos快速搭建K8S1.18集群

使用 kubeadm 创建集群帮助文档 如果您需要以下几点&#xff0c;该工具是很好的选择&#xff1a;kubeadm 一种简单的方法&#xff0c;让你尝试 Kubernetes&#xff0c;可能是第一次。现有用户自动设置群集并测试其应用程序的一种方式。其他生态系统和/或安装程序工具中的构建…

sublime text的json快捷键

系统 macos 配置 sublime Text->Settings->Key Bindings 效果 可以看到&#xff0c;按&#xff1a;shiftcommandp&#xff0c;会出现快捷键窗口&#xff0c;打pretty&#xff0c;会出现Format JSON&#xff0c;最右侧显示⌘J&#xff0c;说明只需要macos的⌘和J同时按…

目标检测YOLO数据集的三种格式及转换

目标检测YOLO数据集的三种格式 在目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;算法是一个流行的选择。为了训练和测试YOLO模型&#xff0c;需要将数据集格式化为YOLO可以识别的格式。以下是三种常见的YOLO数据集格式及其特点和转换方法。 1. YOL…

https协议的加密方式详解

各位大佬能多多点赞关注评论收藏&#xff0c;球球各位大佬们了&#xff01;&#xff01; &#xff01; 目录 1.为什么要加密&#xff1f; 2.如何加密 1.密钥&#xff08;yue,第四声&#xff09; 2.对称加密 3.非对称加密 4.公证机构 3.总结 1.为什么要加密&#xff1f;…

【机器学习】朴素贝叶斯解决实际问题

之前写过这样一道题&#xff1a; 现在换成使用朴素贝叶斯解决这个问题 首先先了解一下朴素贝叶斯 这是之前课本里的笔记记录&#xff1a; 【机器学习笔记】朴素贝叶斯&#xff08;从先验分布到后验分布&#xff09;-CSDN博客 简单的讲解一下这道题需要的知识点 朴素贝叶斯是…

JVM-垃圾收集算法

前言 在 Java 中&#xff0c;垃圾收集&#xff08;Garbage Collection&#xff09;是一种自动管理内存的机制&#xff0c;它负责在运行时识别和释放不再被程序使用的内存&#xff0c;从而避免内存泄漏和悬空引用问题。本篇文章将介绍三种常见的垃圾收集算法。 标记-清除&…