力扣 第 384 场周赛 解题报告 | 珂学家 | 贪心构造 + KMP板子


前言

在这里插入图片描述


整体评价

因为是新春过年,所以题目出的相对简单一些,T4和上周一样,是字符串匹配模板题。


T1. 修改矩阵

思路: 模拟

按要求模拟即可

class Solution {
    public int[][] modifiedMatrix(int[][] matrix) {
        
        int h = matrix.length;
        int w = matrix[0].length;
        int[] cols = new int[w];
        Arrays.fill(cols, Integer.MIN_VALUE);
        for (int j = 0; j < w; j++) {
            for (int i = 0; i < h; i++) {
                cols[j] = Math.max(cols[j], matrix[i][j]);
            }
        }

        int[][] res = new int[h][w];
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                res[i][j] = matrix[i][j];
                if (matrix[i][j] == -1) {
                    res[i][j] = cols[j];
                }
            }
        }
        return res;
    }
}

T2. 匹配模式数组的子数组数目 I

和T4一起讲


T3. 回文字符串的最大数量

思路: 贪心构造

回文只求对称的字符相等,其实和字符是啥没关系。

所以这题可以先打散,把字符频率先统计出来。

然后把偶数项合并,奇数项单独留1。

然后按词长度从小到大进行构造(贪心)。

因为这样的思路,能保证最终的结果不会变得更差。

因此这个贪心思路是可以保证的。

class Solution {
    public int maxPalindromesAfterOperations(String[] words) {
        
        int[] hash = new int[26];
        for (String w: words) {
            for (char c: w.toCharArray()) {
                hash[c - 'a']++;
            }
        }
        int n1 = 0, n2 = 0;
        for (int i = 0; i < 26; i++) {
            int t = hash[i] % 2;
            n1 += t;
            n2 += (hash[i] - t);
        }
        
        List<Integer> lists = new ArrayList<>();
        for (String w: words) {
            lists.add(w.length());
        }
        Collections.sort(lists);
        
        int res = 0;
        for (int v: lists) {
            if (v % 2 == 0) {
                if (n2 >= v) {
                    n2 -= v;
                    res++;
                }
            } else {
                if (n2 >= v - 1 && n1 > 0) {
                    n2 -= (v - 1);
                    n1 -= 1;
                    res++;
                } else if (v == 1 && n1 > 0) {
                    n1 -= 1;
                    res++;
                } else if (n2 >= v) {
                    n2 -= v;
                    res++;
                } 
            }
        }
        return res;
    }
}

T4. 匹配模式数组的子数组数目 II

思路: 字符串匹配

算法: KMP/Z函数/字符串哈希

因为匹配的是大小关系,与具体的差值无关。可以把大小关系转化为固定的字符串。

那这题就变成很纯粹的字符串匹配题,用板子即可。

这边采用KMP解法

class Solution {
 
    public int countMatchingSubarrays(int[] nums, int[] pattern) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < nums.length - 1; i++) {
            int d = nums[i + 1] - nums[i];
            if (d > 0) sb.append('A');
            else if (d < 0) sb.append("C");
            else sb.append('B');
        }
        StringBuilder sb2 = new StringBuilder();
        for (int v: pattern) {
            if (v > 0) sb2.append('A');
            else if (v == 0) sb2.append('B');
            else sb2.append('C');
        }
        
        List<Integer> lists = KMP.findOccurrences(sb.toString(), sb2.toString());
        return lists.size();
    }
    
    static
    class KMP {

        // *) kmp
        // 在text中,找到pattern出现的位置列表
        public static List<Integer> findOccurrences(String text, String pattern) {
            String cur = pattern + '#' + text;
            int sz1 = text.length(), sz2 = pattern.length();
            List<Integer> v = new ArrayList<>();
            int[] lps = prefixFunction(cur);
            for (int i = sz2 + 1; i <= sz1 + sz2; i++) {
                if (lps[i] == sz2) v.add(i - 2 * sz2);
            }
            return v;
        }

        private static int[] prefixFunction(String ss) {
            char[] s = ss.toCharArray();
            int n = s.length;
            int[] pi = new int[n];
            for (int i = 1; i < n; i++) {
                int j = pi[i - 1];
                while (j > 0 && s[i] != s[j]) j = pi[j - 1];
                if (s[i] == s[j]) j++;
                pi[i] = j;
            }
            return pi;
        }

    }
    
}

写在最后

在这里插入图片描述

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

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

相关文章

(AtCoder Beginner Contest 333)--- F - Bomb Game 2 --- 题解

F - Bomb Game 2&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 这道题一读题面就知道他是个概率dp&#xff0c;假如有 i 个人我们要输出这i个人每个人最后能够留下的概率。 设状态dp[i][j] 表示当前有i个人&#xff0c;目标人物位于这i个人中的第j个位置。如果我们通…

【JavaEE Spring】Spring 原理

Spring 原理 1. Bean的作⽤域1.1 概念1.2 Bean的作⽤域 2. Bean的⽣命周期 1. Bean的作⽤域 1.1 概念 在Spring IoC&DI阶段, 我们学习了Spring是如何帮助我们管理对象的. 通过 Controller , Service , Repository , Component , Configuration ,Bean 来声明Bean对象。通…

100套嵌入式大厂笔试/面试题(3)-----------大疆

从本篇开始将会更新历年来各个公司的面试题与面经&#xff0c;题目来自于网上各个平台以及博主自己遇到的&#xff0c;答案也来自网络&#xff0c;后期3月份左右博主打算将答案整理&#xff08;放下文章的最下面&#xff09;&#xff0c;如果对大家有所帮助&#xff0c;帮忙点点…

springboot180基于spring boot的医院挂号就诊系统

医院挂号就诊系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装医院挂号就诊系统软件来发挥其…

突发!AI大牛Andrej Karpathy离开OpenAI

刚刚&#xff0c;AI大牛Andrej Karpathy官宣了一条重要消息&#xff1a;他昨天已经从OpenAI离职&#xff0c;不过这中间没有什么戏剧性冲突&#xff0c;他只是想去尝试一下自己的个人项目。 Karpathy在官宣离职的推文中写道&#xff0c;「是的&#xff0c;我昨天离开了OpenAI。…

板块零 IDEA编译器基础:第三节 下载和在IDEA中集成 Tomcat服务器 来自【汤米尼克的JAVAEE全套教程专栏】

板块零 IDEA编译器基础&#xff1a;第三节 下载和在IDEA中集成 Tomcat服务器 一、为什么选择Tomcat&#xff08;1&#xff09;常见的JAVA WEB服务器&#xff08;2&#xff09;选择Tomcat的理由 二、Tomcat 8.5下载解压三、Tomcat 结构目录四、在IDEA中集成Tomcat 假设我们已经…

关于显卡、显卡驱动、cuda、cuDNN等的区别

关于显卡、显卡驱动、cuda、cuDNN等的区别 刚接触AI或机器学习框架时&#xff0c;经常会被这几个概念搞混&#xff0c;尤其是显卡驱动、cuda、cuDNN这个三个软的东西&#xff1b;此外&#xff0c;NVCC、cudatoolkit又是什么呢&#xff1f; 1. 显卡(GPU) 显卡就是硬件&#xff…

2001-2022年368个地级市平均气温数据

2001-2022年368个地级市平均气温数据 1、时间:2001-2022年 2、范围&#xff1a;368个地级市 3、来源&#xff1a;基于NOAA下属NCEI提供的原始数据编制而成的。 4、指标&#xff1a;年份、省份、省份代码、城市、城市代码、平均气温 5、指标解释&#xff1a;平均气温指某一…

Linux下的多用户管理和认证:从入门到精通(附实例)

Linux操作系统以其强大的多用户管理和认证机制而著称。这种机制不仅允许多个用户同时登录并执行各种任务&#xff0c;还能确保每个用户的数据安全和隐私。本文将通过一系列实例&#xff0c;带你逐步掌握Linux下的多用户管理和认证。 一、Linux多用户管理的基础知识 在Linux中&…

Ubuntu下Anaconda+PyCharm搭建PyTorch环境

这里主要介绍在condapytorch都正确安装的前提下&#xff0c;如何通过pycharm建立开发环境&#xff1b; Ubuntu下AnacondaPyCharm搭建PyTorch环境 系统环境&#xff1a;Ubuntu22.04 conda: conda 23.11.0 pycharm:如下 condapytorch的安装教程介绍&#xff0c;请点击这里&…

【原理分析】用JAVA还原刘谦在2024央视春晚的扑克牌魔术

【原理分析】用JAVA分析刘谦在2024央视春晚的扑克牌魔术 前言原理分析代码实现程序结构变量和方法程序思路代码实现运行截图 总结 前言 央视春晚与魔术师刘谦从2009年开始&#xff0c;近十年间深度捆绑&#xff0c;刘谦开辟了春晚近景魔术的先河&#xff0c;一句“见证奇迹的时…

cordic算法圆周系统计算sin、cos、平方和开根、atan、坐标系变换

cordic算法圆周系统计算sin、cos、平方和开根、atan 一、cordic圆周系统旋转模式和向量模式1.1 旋转模式1.2 向量模式 二、一些需要考虑的事项2.1角度范围2.2输入正负2.3关于迭代精度2.4坐标系旋转 参考文献&#xff1a; 若想计算 s i n sin sin、 c o s cos cos、 x 2 y 2 \s…

python3 中try 异常调试 raise 异常抛出

一、什么是异常&#xff1f; 异常即是一个事件&#xff0c;该事件会在程序执行过程中发生&#xff0c;影响了程序的正常执行。 一般情况下&#xff0c;在Python无法正常处理程序时就会发生一个异常。 异常是Python对象&#xff0c;表示一个错误。 当Python脚本发生异常时我…

Django学习全纪录:编写你的第一个 Django 应用,Django内置数据库的配置,以及扩展性的数据库介绍和配置

天下古今之庸人&#xff0c;皆以一惰字致败&#xff1b;天下古今之人才&#xff0c;皆以一傲字致败。——[清]曾国藩 导言 大家好&#xff0c;在上一篇文章里&#xff0c;我们一起学习了Django的视图以及路由&#xff0c;并且对Django的应用有了初步的认识&#xff0c;掌握了…

Java实现CRM客户管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 用例设计3.2 E-R 图设计3.3 数据库设计3.3.1 客户表3.3.2 商品表3.3.3 客户跟踪表3.3.4 客户消费表3.3.5 系统角色表 四、系统展示五、核心代码5.1 查询客户5.2 新增客户跟踪记录5.3 新增客户消费订单5.4 查…

本地搭建three.js官方文档

因为three.js官网文档是国外的网站&#xff0c;所以你没有魔法的情况下打开会很慢&#xff0c;这时我们需要在本地搭建一个官方文档便于我们学习查看。 第一步&#xff1a;首先我们先访问GitHub地址 GitHub - mrdoob/three.js: JavaScript 3D Library. 下载不下来的小伙伴们私…

30、二维数组/字符串操作相关练习20240214

一、编程实现二维数组的杨辉三角。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h>int main(int argc, const char *argv[]) {int n;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(in…

本地部署Stable Diffusion WebUI

官网 Stable Diffusion在线 Github上的Stable Diffusion WebUI 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 一、 环境所需资源 PythonPycharmAnacondastable-diffusion-webui项目代码 注意事项 python版本一定要3.10&#xff0c;最好是3.10.6版本的。…

vue3 之 商城项目—购物车

购物车业务逻辑梳理拆解 1️⃣整个购物车的实现分为两个大分支&#xff0c;本地购物车操作和接口购物车操作 2️⃣由于购物车数据的特殊性&#xff0c;采取Pinia管理购物车列表数据并添加持久话缓存 本地购物车—加入购物车实现 stores/cartStore.js // 封装购物车模块 imp…

片上网络NoC(6)——路由算法

目录 一、概述 二、路由算法的类型 三、避免死锁 四、实现 4.1 源路由实现 4.2 基于节点查找表的路由实现 4.3 组合电路实现 五、总结 一、概述 路由算法&#xff08;routing algorithm&#xff09;&#xff0c;即决定数据包在网络拓扑中从起点到终点路径的算法。路由算…