Leetcode 第 384 场周赛题解

Leetcode 第 384 场周赛题解

  • Leetcode 第 384 场周赛题解
    • 题目1:3033. 修改矩阵
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3034. 匹配模式数组的子数组数目 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3035. 回文字符串的最大数量
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3036. 匹配模式数组的子数组数目 II
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 384 场周赛题解

题目1:3033. 修改矩阵

思路

模拟。

代码

/** @lc app=leetcode.cn id=3033 lang=cpp** [3033] 修改矩阵*/// @lc code=start
class Solution
{
public:vector<vector<int>> modifiedMatrix(vector<vector<int>> &matrix){if (matrix.empty())return {};int m = matrix.size(), n = m ? matrix[0].size() : 0;auto answer = matrix;for (int i = 0; i < m; i++)for (int j = 0; j < n; j++){// 每个值为 -1 的元素需要替换if (matrix[i][j] == -1){// 找到列最大值int col_max = -1;for (int k = 0; k < m; k++)col_max = max(col_max, matrix[k][j]);// 修改 answer 数组answer[i][j] = col_max;}}return answer;}
};
// @lc code=end

复杂度分析

时间复杂度:O(m2*n),其中 m 和 n 分别是矩阵 matrix 的行数和列数。

空间复杂度:O(m*n),其中 m 和 n 分别是矩阵 matrix 的行数和列数。

题目2:3034. 匹配模式数组的子数组数目 I

思路

暴力。

设数组 nums 的长度为 m,数组 pattern 的长度为 n。

遍历数组 nums 的每个长度是 n+1 的子数组并计算子数组的模式,然后与数组 pattern 比较,如果相等则找到一个匹配模式数组的子数组。遍历结束之后即可得到匹配模式数组的子数组数目。

代码

/** @lc app=leetcode.cn id=3034 lang=cpp** [3034] 匹配模式数组的子数组数目 I*/// @lc code=start
class Solution
{
public:int countMatchingSubarrays(vector<int> &nums, vector<int> &pattern){// 特判if (nums.empty() || pattern.empty())return 0;if (nums.size() <= pattern.size())return 0;int count = 0;int m = nums.size(), n = pattern.size();for (int i = 0; i < m - n; i++){bool flag = true;for (int k = 0; k < n && flag; k++){int diff = nums[i + k + 1] - nums[i + k];int p = getPattern(diff);if (p != pattern[k])flag = false;}if (flag)count++;}return count;}// 辅函数 - 计算 patternint getPattern(int diff){if (diff == 0)return 0;return diff > 0 ? 1 : -1;}
};
// @lc code=end

复杂度分析

时间复杂度:O((m-n)*n),其中 m 为数组 nums 的长度,n 为数组 pattern 的长度。

空间复杂度:O(1)。

题目3:3035. 回文字符串的最大数量

思路

由于可以随意交换字母,先把所有字母都取出来,然后考虑如何填入各个字符串。

如果一个奇数长度字符串最终是回文串,那么它正中间的那个字母填什么都可以。

既然如此,不妨先把左右的字母填了,最后在往正中间填入字母。

字符串越短,需要的字母越少。

所以按照字符串的长度从小到大填。

统计所有字符串的长度之和,减去出现次数为奇数的字母,即为可以往左右填入的字母个数 total。

把字符串按照长度从小到大排序,然后遍历。注意长为奇数的字符串,由于不考虑正中间的字母,其长度要减一。

代码

/** @lc app=leetcode.cn id=3035 lang=cpp** [3035] 回文字符串的最大数量*/// @lc code=start
class Solution
{
public:int maxPalindromesAfterOperations(vector<string> &words){// 特判if (words.empty())return 0;int n = words.size();int total = 0; // 出现次数为偶数的字母总数unordered_map<char, int> mp;for (string &word : words){total += word.length();for (char &c : word)mp[c]++;}// 减去出现次数为奇数的字母for (auto &[ch, cnt] : mp)total -= cnt % 2;sort(words.begin(), words.end(), [](const string &s1, const string &s2){ return s1.length() < s2.length(); });int ans = 0;for (string &word : words){int len = word.length();// 长为奇数的字符串,长度要减一total -= len % 2 == 1 ? len - 1 : len;if (total < 0)break;ans++;}return ans;}
};
// @lc code=end

哈希表可以用位运算优化,详见:【灵茶山艾府】两种方法:正向思维 / 逆向思维(Python/Java/C++/Go)

复杂度分析

时间复杂度:O(L+nlogn),其中 n 是数组 words 的长度,L 是数组 words 中字符串的总长度。

空间复杂度:O(|∑|),其中 ∑ 是字符集,|∑| 为字符集的大小,因为 words[i] 仅由小写英文字母组成,所以 |∑|=26。

题目4:3036. 匹配模式数组的子数组数目 II

思路

设数组 nums 的长度为 m,数组 pattern 的长度为 n。

遍历数组 nums 的每个长度是 n+1 的子数组并计算子数组的模式,然后与数组 pattern 比较,如果相等则找到一个匹配模式数组的子数组。遍历结束之后即可得到匹配模式数组的子数组数目。

我们发现这其实就是 KMP。

将匹配模式转换成字符串:1 对应 ‘a’,0 对应 ‘b’,-1 对应 ‘c’。

代码

/** @lc app=leetcode.cn id=3036 lang=cpp** [3036] 匹配模式数组的子数组数目 II*/// @lc code=start// KMPclass Solution
{
private:// KMP 算法vector<int> getNxt(string &pattern){vector<int> nxt;// next[0] 必然是 0nxt.push_back(0);// 从 next[1] 开始求int x = 1, now = 0;while (x < pattern.length()){if (pattern[now] == pattern[x]){// 如果 pattern[now] == pattern[x],向右拓展一位now++;x++;nxt.push_back(now);}else if (now != 0){// 缩小 now,改成 nxt[now - 1]now = nxt[now - 1];}else{// now 已经为 0,无法再缩小,故 next[x] = 0nxt.push_back(0);x++;}}return nxt;}vector<int> kmp(string &s, string &pattern){int m = pattern.length();vector<int> nxt = getNxt(pattern);vector<int> res;int tar = 0; // 主串中将要匹配的位置int pos = 0; // 模式串中将要匹配的位置while (tar < s.length()){if (s[tar] == pattern[pos]){// 若两个字符相等,则 tar、pos 各进一步tar++;pos++;}else if (pos != 0){// 失配,如果 pos != 0,则依据 nxt 移动标尺pos = nxt[pos - 1];}else{// pos[0] 失配,标尺右移一位tar++;}if (pos == pattern.length()){res.push_back(tar - pos);pos = nxt[pos - 1];}}return res;}public:int countMatchingSubarrays(vector<int> &nums, vector<int> &pattern){// 特判if (nums.empty() || pattern.empty())return 0;if (nums.size() <= pattern.size())return 0;int count = 0;int m = nums.size(), n = pattern.size();// 1 对应 'a',0 对应 'b',-1 对应 'c'string s;for (int i = 0; i < m - 1; i++){int diff = nums[i + 1] - nums[i];int p = getPattern(diff);if (p == 1)s += "a";else if (p == 0)s += "b";elses += "c";}string p;for (int &pa : pattern){if (pa == 1)p += "a";else if (pa == 0)p += "b";elsep += "c";}return kmp(s, p).size();}// 辅函数 - 计算 patternint getPattern(int diff){if (diff == 0)return 0;return diff > 0 ? 1 : -1;}
};
// @lc code=end

复杂度分析

时间复杂度:O(m),其中 m 是数组 nums 的长度。

空间复杂度:O(n),其中 n 是数组 pattern 的长度。

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

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

相关文章

C语言标准库介绍:<string.h>

在C语言中&#xff0c;<string.h>头文件是标准库中的一个重要部分&#xff0c;它定义了一系列操作字符串和字符数组的函数。本文将详细介绍<string.h>头文件中包含的22个函数&#xff0c;并提供每个函数的完整示例代码。 简介 <string.h>头文件定义了一个变…

设计模式-工厂模式(Factory Pattern)

一、工厂模式说明 工厂模式是一种创建型设计模式&#xff0c;它提供了一种将对象的创建与使用分离的方式。工厂模式通过引入一个公共的接口来创建对象&#xff0c;而不是通过直接调用构造函数来创建对象。这样做的好处是使得代码更加灵活&#xff0c;更容易维护和扩展。 工厂模…

第3部分 原理篇2去中心化数字身份标识符(DID)(2)

3.2.2. DID相关概念 3.2.2.1. 去中心化标识符 (Decentralized identifier&#xff0c;DID) 本聪老师&#xff1a;DID有两个含义&#xff0c;一是Decentralized identity&#xff0c;就是去中心化身份&#xff0c;是广泛意义的DID。另外一个是Decentralized identifier&#xf…

Web性能优化-浏览器工作原理-MDN文档学习笔记

浏览器工作原理 查看更多学习笔记&#xff1a;GitHub&#xff1a;LoveEmiliaForever MDN中文官网 导航 导航是加载 web 页面的第一步&#xff1a;输入 URL、点击一个链接、提交表单等等 DNS查询 导航的第一步是要去寻找页面资源的位置 例如访问https://example.com&#x…

如何解决DNS解析错误故障

DNS解析错误会导致将一个域名解析为错误的IP地址&#xff0c;或者根本无法确定某个域名对应的IP地址&#xff0c;从而无法通过域名访问相应的站点&#xff0c;形成DNS解析故障。最常见的症状是访问站点对应的IP地址没有问题&#xff0c;但访问其域名时却出现错误。 DNS解析异常…

qt-动画圆圈等待-LED数字

qt-动画圆圈等待-LED数字 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "LedNumber.h" #include <QLabel>LEDNumber::LEDNumber(QWidget *parent) : QWidget(parent) {//设置默认宽高比setScale((float)0.6);//设置默认背景色se…

【深入了解TensorFlow】TensorFlow的安装与配置

【深入了解TensorFlow】TensorFlow的安装与配置 TensorFlow的安装与配置准备就绪:开始前的准备工作1. 确定您的硬件和操作系统2. 选择安装方式3. 创建虚拟环境(可选)安装TensorFlow使用pip安装使用conda安装从源代码编译安装配置TensorFlow导入TensorFlow模块检查安装是否成…

Oracle 表被删除或重命名后账户间的授权与同义词关系

Oracle 表被删除或重命名后账户间的授权与同义词关系 情景一、 当数据表删除后 数据表被删除后&#xff0c;同义词还是存在的&#xff0c;可以查看当前用户下查看同义词&#xff1a; -- 查看当前用户下的同义词 select * from user_synonyms但授权关系不在了&#xff0c;若重…

10 个 Linux 中超方便的 Bash 别名

1、 你有几次遇到需要解压 .tar 文件但无法记住所需的确切参数&#xff1f;别名可以帮助你&#xff01;只需将以下内容添加到 .bash_profile 中&#xff0c;然后使用 untar FileName 解压缩任何 .tar 文件。 alias untartar -zxvf 2、 下载文件时&#xff0c;如果出现问题想要…

websocket与Socket的区别

概念讲解 网络&#xff1a;通俗意义上&#xff0c;也就是连接两台计算器 五层网络模型&#xff1a;应用层、传输层、网络层、数据链路层、物理层 应用层 (application layer)&#xff1a;直接为应用进程提供服务。应用层协议定义的是应用进程间通讯和交互的规则&#xff0c;不…

明明正常,却不停return

明明正常&#xff0c;却不停return if(!is); { return ; } 熬人

应急响应速查

最重要的&#xff1a;我是谁&#xff1f;我在哪&#xff1f;别人怎么进来的&#xff1f;我就是这个被挖矿被勒索的电脑。 分析项 &#xff1a; 一、了解大概的被入侵系统情况&#xff1a; 发现时间&#xff1f;怎么发现的&#xff1f;这台机器有没有人运维&#xff1f;平时还…

排序第三篇 直接插入排序

插入排序的基本思想是&#xff1a; 每次将一个待排序的记录按其关键字的大小插入到前面已排好序的文件中的适当位置&#xff0c; 直到全部记录插入完为止。 一 简介 插入排序可分为2类 本文介绍 直接插入排序 它的基本操作是&#xff1a; 假设待排充序的记录存储在数组 R[1……

电路设计(27)——交通信号灯的multisim仿真

1.功能要求 使用数字芯片设计一款交通信号灯&#xff0c;使得&#xff1a; 主干道的绿灯时间为60S&#xff0c;红灯时间为45S 次干道的红灯时间为60S&#xff0c;绿灯时间为45S 主、次干道&#xff0c;绿灯的最后5S内&#xff0c;黄灯闪烁 使用数码管显示各自的倒计时时间。 按…

JavaScript 数组、遍历

数组 多维数组&#xff1a;数组里面嵌套 一层数组为二维数组。一维数组的使用频率是最高的。 如果数组访问越界会返回undefined。 数组遍历 数组方法Array.isArray() 这个方法可以去判定一个内容是否是数组。

AndroidStudio 2024-2-21 Win10/11最新安装配置(Kotlin快速构建配置,gradle镜像源)

AndroidStudio 2024 Win10/11最新安装配置 教程目的&#xff1a; (从安装到卸载) &#xff0c;针对Kotlin开发配置&#xff0c;gradle-8.2-src/bin下载慢&#xff0c;以及Kotlin构建慢的解决 好久没玩AS了,下载发现装个AS很麻烦,就觉得有必要出个教程了(就是记录一下:嘻嘻) 因…

把一个对象变成可迭代对象的两种方法,使用Symbol.iterator 和生成器Generator

方法一&#xff1a;自定义Symbol.iterator属性 如果对象拥有[Symbol.iterator] 方法&#xff0c;改方法返回一个迭代器对象&#xff0c;就可以称之为可迭代对象&#xff0c;注意迭代器是一个有 next 方法的对象 步骤如下 实现一个Symbol.iterator 键值是一个函数&#xff0c;…

java 时间格式 YYYY 于yyyy的区别

java formatDate 时间时&#xff0c;经常需要输入格式比如 YYYYMMDD,yyyyMMdd 这两个是有区别的 具体每个参数可以看下面

igolang学习1,dea的golang-1.22.0

参考&#xff1a;使用IDEA配置GO的开发环境备忘录-CSDN博客 1.下载All releases - The Go Programming Language (google.cn) 2.直接next 3.window环境变量配置 4.idea的go插件安装 5.新建go项目找不到jdk解决 https://blog.csdn.net/ouyang111222/article/details/1361657…

代码随想录算法训练营第40天| 343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 完成 思路&#xff1a; dp数组存放正整数i拆分后的乘积最大值&#xff1b;i可以拆分为j和i-j&#xff0c;也可以是j和dp[i-j]。 代码 class Solution {public int integerBreak(int n) {int[] dp new int[n1];dp[2] 1;// 推导i的拆分乘积最大值for (int i …