Leetcode - 周赛384

news2024/12/23 8:42:01

目录

一,3033. 修改矩阵

二,3035. 回文字符串的最大数量

三,3036. 匹配模式数组的子数组数目 II


一,3033. 修改矩阵

 这道题直接暴力求解,先算出每一列的最大值,再将所有为-1的区域替换成该列的最大值,代码如下:

class Solution {
    public int[][] modifiedMatrix(int[][] matrix) {
        int n = matrix.length;
        int m = matrix[0].length;
        int[] max = new int[m];
        for(int j=0; j<m; j++){
            for(int i=0; i<n; i++){//得到每列的最大值
                max[j] = Math.max(max[j],matrix[i][j]);
            }
        }
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
               if(matrix[i][j] == -1){//是-1就进行替换
                   matrix[i][j] = max[j];
               }
            }
        }
        return matrix;
    }
}

二,3035. 回文字符串的最大数量

 这道题是问我们:怎样交换可以使words数组包含最大数量的回文串,注意只要输出回文串的最大数量。再仔细看题就会发现,这些数组中字符都是可以相互交换的,也就是说,我们可以先使用hash或者int[26](题目说了只包含小写字母)来统计一下words数组中包含哪些字符及其对应的数目,再自己构造出固定长度的回文字符串。

这时还有一个问题,就是如何保证我们构造的字符串的数目一定是最大的,这里我们就要使用贪心的思想了,我们可以先得到words数组中字符串的长度,并将其从小到大排序,再根据长度从小到大来构造回文字符串,这样就可以保证构造出的回文字符串的数目是最大的。

其实再进一步想一想,回文字符串的特点是什么?不就是对称吗,也就是说我们根本不需要知道各个字符的数量,只需要知道,有多少成对的字符(使用two代替),又有多少单个字符(使用one来代替)。

大体思路想好了,剩下的就是如何构造字符串(假设我们要构造长度为x的回文字符串):

 1)剩下的字符可以构造出字符串, 即 two - x/2 >= 0 && one - x%2 >= 0,同时ans++

2)剩下的字符不可以构造出字符串: 

  1. 缺少成对的字符, 这时直接返回,因为我们是从小到大来构造字符串的,如果这个构造的字符串缺少成对的字符,那么后面的也一定缺少,即 two - x/2 < 0
  2. 缺少单个字符,即 one - x%2 < 0, 这时候我们要看two是否还多余,如果多余,我们可以从two中拿出一个,同时ans++ (注意:当我们从two中拿出一个时,我们的one也要同时+1,相当于是将一个成对的字符拆成单个字符来使用),如果缺少,直接返回。

进阶:上述讨论的2.2这种情况真的存在吗?

  • 我们这样想一想,当答案就等于words.length的时候,two是最大的,one是最小的,而当one是最小的时候,他也能满足单个字符的需求,也就是说,我们不需要关心one,只需要关心two,即 two - x/2 >= 0 或者  two - x/2 < 0,当 >= 0 时, ans++;当 < 0 时,直接返回答案。

上代码:

class Solution {
    public int maxPalindromesAfterOperations(String[] words) {

        int[] m = new int[26];//统计各个字符出现的次数
        int[] t = new int[words.length];//统计words数组中字符串的长度
        for(int i=0; i<words.length; i++){
            t[i] = words[i].length(); 
            for(char ch : words[i].toCharArray()){
                m[ch-'a']++;
            }
        }

        Arrays.sort(t);//从小到大排序
        int two = 0;//统计成对字符的数目
        for(int i=0; i<26; i++){
            two += m[i]/2;
        }

        int ans = 0;
        for(int x : t){//从小到大构造回文字符串
            if(two-x/2>=0){
                two -= x/2;
                ans++;
            }else{
                return ans;
            }
        }

        return ans;    
    }
}

三,3036. 匹配模式数组的子数组数目 II

   

 这周周赛的二四题是相同的,这里就一起讲了。

该题的关键点在于是否能将这道题转换成一个 "字符串匹配" 问题:

我们通过题目给的条件:

  •  nums[i] - nums[i-1] > 0,t[i-1] = 1 
  • nums[i] - nums[i-1] == 0, t[i-1] = 0
  • nums[i] - nums[i-1] < 0, t[i-1] = -1

可以得到一个 int[] t = new int[nums.length-1] 的数组,然后通过kmp算法求数组 t 中有多少和数组pattern相同的字数组。 

 代码如下:

class Solution {
    public int countMatchingSubarrays(int[] nums, int[] pattern) {
        int n = nums.length;
        int[] t = new int[n-1];
        for(int i=1; i<n; i++){
            if(nums[i]-nums[i-1]==0)
                t[i-1] = 0;
            else if(nums[i]-nums[i-1]>0)
                t[i-1] = 1;
            else 
                t[i-1] = -1;
        }
        //求next数组
        int k = pattern.length;
        int[] next = new int[k];
        for(int i=1, j=0; i<k; i++){
            while(j>0&&pattern[i]!=pattern[j]){
                j = next[j-1];
            }
            if(pattern[i]==pattern[j])
                j++;
            next[i] = j;
        }
        //字符串匹配
        int ans = 0;
        for(int i=0, j=0; i<n-1; i++){
            while(j>0&&j<k&&t[i]!=pattern[j]){
                j = next[j-1];
            }
            if(t[i]==pattern[j])
                j++;
            if(j==k){
                j = next[j-1];
                ans++;
            }
        }

        return ans;
    }
}

除了KMP算法之外,还可以通过Z函数算法来求解,下面简单来讲一讲Z函数算法的思想:和KMP的思路差不多,只不过kmp中的 next 数组是用来求字符串中的最长前后缀,而Z函数中的 z 数组则是用来求字符串的最长前前缀,举一个例子:

    

 使用该方法麻烦的点是:需要手动的将 pattern 数组添加到 t 数组的前面,然后只需要统计 z[i] (i >= pattern.length)大于等于 pattern.length 的数目就行了。

class Solution {
    public int countMatchingSubarrays(int[] nums, int[] pattern) {
        int n = nums.length;
        int[] t = new int[n-1];
        for(int i=1; i<n; i++){
            if(nums[i]-nums[i-1]==0)
                t[i-1] = 0;
            else if(nums[i]-nums[i-1]>0)
                t[i-1] = 1;
            else 
                t[i-1] = -1;
        }

        List<Integer> ls = new ArrayList<>();
        for(int x : pattern) ls.add(x);
        for(int x : t) ls.add(x);

        int ans = 0;
        int k = pattern.length;
        int[] z = new int[ls.size()];
        int l=0, r=0;
        for(int i=1; i<ls.size(); i++){
            if(i <= r)
                z[i] = Math.min(z[i-l], r-i+1);
            while(i+z[i]<ls.size() && ls.get(z[i]) == ls.get(i+z[i])){
                l = i;
                r = i + z[i];
                z[i]++;
            }
            if(i>=k && z[i]>=k) 
                ans++;
        }
        return ans;
    }
}

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

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

相关文章

mysql 2-17

UNION关键字和UNION ALL 自然连接 USING使用 函数 单行函数 基本函数 三角函数 指数和对数 进制间的转换 字符串函数 时间和日期函数 计算日期和时间的函数 日期的格式化和解析 流程控制函数

输入输出自定义映射矩阵(数据结构树)

输出自定义FC其它算法实现,可以参考下面文章: https://rxxw-control.blog.csdn.net/article/details/125994252https://rxxw-control.blog.csdn.net/article/details/125994252下面我们看下我们的控制要求。在学习本篇博客之前大家可以熟悉下数据结构图的概念和存储知识,链…

【复合多尺度熵与特征提取】一文看懂“复合多尺度熵”——复合多尺度样本熵、模糊熵、排列熵、包络熵、功率谱熵、能量熵、奇异谱熵及其MATLAB实现

在上一篇文章中&#xff0c;我们讲了多尺度熵的原理及MATLAB实现。 本篇要讲的是多尺度熵的一个改进特征提取方法——复合多尺度熵&#xff08;Composite Multiscale Entropy, CMSE&#xff09;。复合多尺度熵方法不仅继承了多尺度熵在揭示时间序列多尺度复杂性方面的优势&…

【Python--Web应用框架大比较】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Django Django太重了&#xff0c;除了web框架&#xff0c;自带ORM和模板引擎&#xff0c;灵活和自由度不…

定时器外部时钟

一、相较于内部时钟中断改动&#xff1a; 1.Timer.c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_…

ACM题解Day4 | Boring Non-Palindrome ,Mental Rotation ,so Easy

学习目标&#xff1a; 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门算法 &#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; ☆*: .&#xff61;. o(≧▽…

GuitarPro8激活许可证24位下载

Guitar Pro是一款专业的吉他制谱软件&#xff0c;现在已更新至Guitar Pro8&#xff0c;新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。下面我们来看Guitar Pro8 如何安装激活。 Guitar Pro 8.1官方中文解锁版如何安装 …

可视化和跟踪机器学习实验的工具——Wandb

简介&#xff1a;用于可视化和跟踪机器学习实验的工具。Weights & Biases 是一个机器学习平台&#xff0c;供开发人员更快地构建更好的模型。使用 W&B 的轻量级、可互操作的工具快速跟踪实验、对数据集进行版本和迭代、评估模型性能、重现模型、可视化结果和发现回归&a…

【Java多线程进阶】JUC常见类以及CAS机制

1. Callable的用法 之前已经接触过了Runnable接口&#xff0c;即我们可以使用实现Runnable接口的方式创建一个线程&#xff0c;而Callable也是一个interface&#xff0c;我们也可以用Callable来创建一个线程。 Callable是一个带有泛型的interface实现Callable接口必须重写cal…

【sgCreateTableData】自定义小工具:敏捷开发→自动化生成表格列数据数组[基于el-table]

源码 <template><!-- 前往https://blog.csdn.net/qq_37860634/article/details/136141769 查看使用说明 --><div :class"$options.name"><div class"sg-head">表格数据生成工具</div><div class"sg-container&quo…

Nginx (window)2024版 笔记 下载 安装 配置

前言 Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理&#xff08;Reverse Proxy&#xff09;服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。 反向代理方式是指以代理服务器来接受 internet 上的连接请求&#xff0c;然后将请求转发给内部网络上的服…

java8-使用流-2

筛选各异的元素 流还支持一个叫作aistinct的方法&#xff0c;它会返回一个元素各异(根据流所生成元素的hashcode和eguals方法实现)的流。例如&#xff0c;以下代码会筛选出列表中所有的偶数&#xff0c;并确保没有重复。图5-2直观地显示了这个过程。 List<Integer>number…

「算法」滑动窗口

前言 算法需要多刷题积累经验&#xff0c;所以我行文重心在于分析解题思路&#xff0c;理论知识部分会相对简略一些 正文 滑动窗口属于双指针&#xff0c;这两个指针是同向前行&#xff0c;它们所夹的区间就称为“窗口” 啥时候用滑动窗口&#xff1f; 题目涉及到“子序列…

Unity所有关于旋转的方法详解

前言&#xff1a;欧拉角和四元数的简单描述 我们在Inspector面板上看到的rotation其实是欧拉角&#xff0c; 我们将Inspector面板设置成Debug模式&#xff0c;此时看到的local Rotation才是四元数。 Unity中的欧拉旋转是按照Z-X-Y顺规执行的旋转&#xff0c;一组欧拉旋转过程中…

C++11---lambda表达式

lambda表达式 lambda表达式概念lambda表达式语法lambda表达式各部分说明 lambda表达式交换两个数lambda表达式底层原理lambda表达式的底层原理 lambda表达式之间不能相互赋值 lambda表达式概念 lambda表达式是一个匿名函数&#xff0c;恰当使用lambda表达式可以让代码变得简洁…

Linux CPU 性能分析工具火焰图(Flame Graphs)认知

写在前面 博文内容为 《BPF Performance Tools》 读书笔记整理详细了解小伙伴可以访问作者官网&#xff1a;https://www.brendangregg.com/flamegraphs.html有油管上分享的作者在USENIX ATC 2017 的视屏理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&a…

Day-01-01

项目准备 项目介绍 1. 业务功能 本项目包括了用户端、机构端、运营端。 2. 技术选型 各层简要说明&#xff1a; 环境配置 1. 版本信息 在开发过程中&#xff0c;个人使用gitee作为版本控制工具。 2. 虚拟机安装说明 根据所提供资料&#xff0c;虚拟机IP地址已设置为192.1…

OpenAI Sora出炉,视频鉴赏,详细介绍,小白看过来~~立即尝试Sora,开启您的AI视频创作之旅吧!

OpenAI最新推出的视频创作的颠覆性产品&#xff1a;Sora&#xff0c;它开启了该行业的新纪元&#xff0c;吊打目前一众视频制作工具。 无论是专业人士还是爱好者&#xff0c;都可以轻松创作出高质量的视频内容。 Sora同样是一个根据文本指令创建逼真而富有想象力的场景的人工智…

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法 2.1 图统计和核方法2.1.1 节点层次的统计和特征节点的度 节点中心度聚类系数Closed Triangles, Ego Graphs, and Motifs 图层次的特征和图的核节点袋Weisfieler–Lehman核Graphlets和基于路径的方法 邻域…

Flex布局简介及微信小程序视图层View详解

目录 一、Flex布局简介 什么是flex布局&#xff1f; flex属性 基本语法和常用属性 Flex 布局技巧 二、视图层View View简介 微信小程序View视图层 WXML 数据绑定 列表渲染 条件渲染 模板 WXSS 样式导入 内联样式 选择器 全局样式与局部样式 WXS 示例 注意事项…