Leetcode - 周赛384

目录

一,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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能学习与实训笔记(七):神经网络之推荐系统处理

九、模型压缩与知识蒸馏 出于对响应速度&#xff0c;存储大小和能耗的考虑&#xff0c;往往需要对大模型进行压缩。 模型压缩方法主要可以分为以下四类&#xff1a; 参数修剪和量化&#xff08;Parameter pruning and quantization&#xff09;&#xff1a;用于消除对模型表…

Java 学习和实践笔记(12)

这个就比较有意思了&#xff01;所有的事情&#xff0c;拆分完之后&#xff0c;都有且只有这三种状态流程&#xff01; //TIP To <b>Run</b> code, press <shortcut actionId"Run"/> or // click the <icon src"AllIcons.Actions.Execute&…

Vue源码系列讲解——模板编译篇【二】(整体运行流程)

目录 1. 整体流程 2. 回到源码 3. 总结 1. 整体流程 上篇文章中我们说了&#xff0c;在模板解析阶段主要做的工作是把用户在<template></template>标签内写的模板使用正则等方式解析成抽象语法树&#xff08;AST&#xff09;。而这一阶段在源码中对应解析器&…

《区块链公链数据分析简易速速上手小册》第7章:数据获取和分析的挑战(2024 最新版)

文章目录 7.1 数据准确性和完整性验证7.1.1 基础知识7.1.2 重点案例&#xff1a;验证加密货币交易数据准备工作实现步骤步骤1: 从 API 获取比特币交易数据步骤2: 数据转换和初步校验步骤3: 验证交易数据的格式和范围 结论 7.1.3 拓展案例 1&#xff1a;使用哈希校验数据完整性准…

NLP_Transformer架构

文章目录 Transformer架构剖析编码器-解码器架构各种注意力的应用Transformer中的自注意力Transformer中的多头自注意力Transformer中的编码器-解码器注意力Transformer中的注意力掩码和因果注意力 编码器的输入和位置编码编码器的内部结构编码器的输出和编码器-解码器的连接解…

NBA2K24 精品蔡徐坤面补

NBA2K24 精品蔡徐坤面补 NBA2K23-NBA2K24通用 精品蔡徐坤面补 下载地址&#xff1a; https://www.changyouzuhao.cn/13072.html

BUGKU-WEB eval

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; <?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?>解题思路 PHP代码审计咯 相关工具 百度搜索PHP相关知识 解题步骤 分析脚…

C++数据结构与算法——栈与队列

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

java+SSM+mysql 开放式实验管理系统78512-计算机毕业设计项目选题推荐(免费领源码)

摘 要 我国高校开放式实验管理普遍存在实验设备使用率较低、管理制度不完善,实验设备共享程度不高等诸多问题。要在更大范围推行开放式实验管理,就必须在开放式实验教学管理流程中,通过引入信息化管理加大信息技术在其中的应用,才能真正发挥这种教学模式的开放性优势。 本系统…

C#,二进制数的非0位数统计(Bits Count)的算法与源代码

计算一个十进制数的二进制表示有多少位1&#xff1f; 1 遍历法&#xff08;递归或非递归&#xff09; 使用循环按位统计1的个数。 2 哈希查表法 利用一个数组或哈希生成一张表&#xff0c;存储不同二进制编码对应的值为1的二进制位数&#xff0c;那么在使用时&#xff0c;只…

MIT-BEVFusion系列八--onnx导出2 spconv network网络导出

这里写目录标题 export-scn.py加载模型设置每层的精度属性初始化输入参数导出模型model.encoder_layers 设置初始化参数设置 indice_key 属性更改 lidar backbone 的 forward更改lidar网络内各个层的forward带参数装饰器&#xff0c;钩子函数代码使用装饰器修改forward举例 跟踪…

GPU芯片逆势扩张,NVIDIA成为2023年全球芯片的唯一赢家

市调机构Gartner发布数据指出2023年全球诸多芯片行业都在下滑&#xff0c;唯一取得增长的仅有GPU/AI芯片&#xff0c;GPU芯片的市场规模增加了一倍&#xff0c;而领头羊NVIDIA无疑成为最大的赢家。 从2022年下半年以来&#xff0c;全球芯片行业就已步入供给过剩的阶段&#xff…

HarmonyOS—状态管理概述

在前文的描述中&#xff0c;我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面&#xff0c;就需要引入“状态”的概念。 图1 效果图 上面的示例中&#xff0c;用户与应用程序的交互触发了文本状态变更&#xff0c;状态变更引起了UI渲染&#xff0c;UI从“He…

C++中对象的构造与析构顺序

一、对象的构造顺序 对象的构造&#xff0c;先被创建的对象&#xff0c;先被构造&#xff0c;先调用其构造函数 class A { private:int _a 0; public://构造函数A(int a 0){_a a;cout << "A(int a 0)" << " " << _a << endl…

【计算机网络】网际协议——互联网中的转发和编址

编址和转发是IP协议的重要组件 就像这个图所示&#xff0c;网络层有三个主要组件&#xff1a;IP协议&#xff0c;ICMP协议&#xff0c;路由选择协议IPV4 没有选项的时候是20字节 版本&#xff08;号&#xff09;&#xff1a;4比特&#xff1a;规定了IP协议是4还是6首部长度&am…

【Redis】Redis

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 Nosql为什么使用Nosql什么是NosqlNosql特点 Redis入门windows安装Linux安装 Nosql 为什么使用N…

盐构造发育的动力学机制

盐构造可以由以下6 种机制触发引起(图 2)[18] &#xff1a;①浮力作用&#xff1b;②差异负载作用&#xff1b;③重力扩张作 用&#xff1b;④热对流作用&#xff1b;⑤挤压作用&#xff1b;⑥伸展作用。盐体 的塑性流动和非常规变形是盐构造的主要特点,岩 盐有时在几百m 深处就…

Linux第一个小程序-进度条

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、回车和换行 二、行缓冲区概念 三、倒计时 四、进度条代码 版本一&#xff1a; ​编辑 版本二&#xff1a; 总结 前言 世上有两种耀眼的光芒&#xff0c;一…

java中的枚举

枚举 枚举类型的概述 关键字&#xff1a;enum 你可以把枚举类型理解成是一个自定义的常量的序列 枚举的语法结构 定义的枚举类型文件 package com.it.xiaosi.demo01;/*** Classname : direction* Description : TODO 枚举* Author : lin_refuelqq.com*/ public enum direct…

关于VIT(Vision Transformer)的架构记录

在VIT模型设计中&#xff0c;尽可能地紧密遵循原始的Transformer模型&#xff08;Vaswani等人&#xff0c;2017年&#xff09;。这种刻意简化的设置的一个优势是&#xff0c;可扩展的NLP Transformer架构及其高效的实现几乎可以即插即用。 图&#xff1a;模型概述。我们将图像分…