第 384 场 LeetCode 周赛题解

news/2024/5/19 2:13:04 标签: leetcode, 算法, 模拟, 枚举, 贪心, 滚动哈希

A leetcode.cn/problems/modify-the-matrix/description/" rel="nofollow">修改矩阵

在这里插入图片描述
在这里插入图片描述

模拟

class Solution {
public:
    vector<vector<int>> modifiedMatrix(vector<vector<int>> &matrix) {
        int m = matrix.size(), n = matrix[0].size();
        vector<int> mx(n, INT32_MIN);
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                mx[j] = max(mx[j], matrix[i][j]);
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                if (matrix[i][j] == -1)
                    matrix[i][j] = mx[j];
        return matrix;
    }
};

B leetcode.cn/problems/number-of-subarrays-that-match-a-pattern-i/description/" rel="nofollow">匹配模式数组的子数组数目 I

在这里插入图片描述
在这里插入图片描述

枚举 n u m s nums nums 中长为 m + 1 m+1 m+1 的子数组,判断是否匹配模式数组

class Solution {
public:
    int countMatchingSubarrays(vector<int> &nums, vector<int> &pattern) {
        int n = nums.size(), m = pattern.size();
        int res = 0;
        for (int i = 0, j = m; j < n; i++, j++) {
            int k = 0;
            for (; k < m; k++) {
                if (nums[k + i + 1] > nums[k + i] && pattern[k] != 1)
                    break;
                if (nums[k + i + 1] == nums[k + i] && pattern[k] != 0)
                    break;
                if (nums[k + i + 1] < nums[k + i] && pattern[k] != -1)
                    break;
            }
            if (k == m)
                res++;
        }
        return res;
    }
};

C leetcode.cn/problems/maximum-palindromes-after-operations/description/" rel="nofollow">回文字符串的最大数量

在这里插入图片描述
在这里插入图片描述

贪心:记录 w o r d s words words 中各字符总数,得到形成配对的字符数目 e v e n even even 和单一的字符数目 o d d odd odd,按 w o r d s words words 中字符串长短升序枚举字符串,判断能否形成回文字符串

class Solution {
public:
    int maxPalindromesAfterOperations(vector<string> &words) {
        vector<int> cnt(26);
        vector<int> li;
        for (auto &s: words) {
            li.push_back(s.size());
            for (auto c: s)
                cnt[c - 'a']++;
        }
        sort(li.begin(), li.end());
        int odd = 0, even = 0;//even:形成配对的字符数目,odd:单一的字符数目
        for (int i = 0; i < 26; i++)
            if (cnt[i]) {
                even += cnt[i] / 2 * 2;
                odd += cnt[i] % 2;
            }
        int res = 0;
        for (auto x: li) {
            if (x & 1) {
                if (even < x - 1)
                    break;
                even -= x - 1;
                if (odd == 0) {
                    if (even == 0)
                        break;
                    //需要拆一对配对字符
                    even--;
                    odd++;
                } else
                    odd--;
            } else {
                if (even < x)
                    break;
                even -= x;
            }
            res++;
        }
        return res;
    }
};

D leetcode.cn/problems/number-of-subarrays-that-match-a-pattern-ii/description/" rel="nofollow">匹配模式数组的子数组数目 II

在这里插入图片描述
在这里插入图片描述

滚动哈希 + 枚举枚举 n u m s nums nums 中长为 m + 1 m+1 m+1 的子数组,用哈希判断是否匹配模式数组

class Solution {
public:
    int countMatchingSubarrays(vector<int> &nums, vector<int> &pattern) {
        int n = nums.size(), m = pattern.size();
        vector<int> li;
        for (int i = 0; i + 1 < n; i++) {
            if (nums[i + 1] > nums[i])
                li.push_back(1);
            else if (nums[i + 1] == nums[i])
                li.push_back(0);
            else
                li.push_back(-1);
        }
        srand(time(0));//随机种子
        int e = 2333 + rand() % 100, p = 1e9 + rand() % 100;
        shash h1(li, e, p), h2(pattern, e, p);
        int res = 0;
        for (int i = 0; i + m - 1 < li.size(); i++)
            if (h1(i, i + m - 1) == h2(0, m - 1))
                res++;
        return res;
    }

    class shash {//滚动哈希模板
    public:
        using ll = long long;
        vector<ll> pres;
        vector<ll> epow;
        ll e, p;

        shash(vector<int> &s, ll e, ll p) {
            int n = s.size();
            this->e = e;
            this->p = p;
            pres = vector<ll>(n + 1);
            epow = vector<ll>(n + 1);
            epow[0] = 1;
            for (int i = 0; i < n; i++) {
                pres[i + 1] = (pres[i] * e + s[i]) % p;
                epow[i + 1] = (epow[i] * e) % p;
            }
        }

        ll operator()(int l, int r) {
            ll res = (pres[r + 1] - pres[l] * epow[r - l + 1] % p) % p;
            return (res + p) % p;
        }
    };
};


http://www.niftyadmin.cn/n/5374288.html

相关文章

20240211请问B站自动生成的字幕怎么下载?

20240211请问B站自动生成的字幕怎么下载&#xff1f; 2024/2/11 17:40 缘起&#xff1a;最近在搞 一生一芯 项目。 https://ysyx.oscc.cc/ https://ysyx.oscc.cc/docs/ 第六期"一生一芯"课程主页 课时: 每周六15:00~17:00 B站直播 | 录播链接 在键盘按F12这个快捷键盘…

3D打印新突破!2024年第二篇Science研究!

2024年3D打印技术领域第二篇Science文章于2月8日发表。 来自澳大利亚昆士兰大学&#xff08;Jingqi Zhang等&#xff09;、重庆大学&#xff08;Ziyong Hou 、Xiaoxu Huang&#xff09;、丹麦技术大学的联合团队发表了题为“Ultrauniform, strong, and ductile 3D-printed tita…

精读《js 模块化发展》

1 引言 如今&#xff0c;Javascript 模块化规范非常方便、自然&#xff0c;但这个新规范仅执行了 2 年&#xff0c;就在 4 年前&#xff0c;js 的模块化还停留在运行时支持&#xff0c;10 年前&#xff0c;通过后端模版定义、注释定义模块依赖。对经历过来的人来说&#xff0c;…

【数据结构】13:表达式转换(中缀表达式转成后缀表达式)

思想&#xff1a; 从头到尾依次读取中缀表达式里的每个对象&#xff0c;对不同对象按照不同的情况处理。 如果遇到空格&#xff0c;跳过如果遇到运算数字&#xff0c;直接输出如果遇到左括号&#xff0c;压栈如果遇到右括号&#xff0c;表示括号里的中缀表达式已经扫描完毕&a…

Netty应用(六) 之 异步 Channel

目录 12.Netty异步的相关概念 12.1 异步编程的概念 12.2 方式1&#xff1a;主线程阻塞&#xff0c;等待异步线程完成调用&#xff0c;然后主线程发起请求IO 12.3 方式2&#xff1a;主线程注册异步线程&#xff0c;异步线程去回调发起请求IO 12.4 细节注释 12.5 异步的好处…

《21天精通IPv4 to IPv6》第14天:第二周综合回顾——如何落地IPv6?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

《UE5_C++多人TPS完整教程》学习笔记8 ——《P9 访问 Steam(Acessing Steam)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P9 访问 Steam&#xff08;Acessing Steam&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

Rust条件语句:if-else表达式详解

在Rust中&#xff0c;条件语句是控制程序流程的重要组成部分。if-else表达式是一种用于根据条件执行不同代码分支的强大工具。本篇博客将深入介绍Rust中的if-else表达式&#xff0c;并通过具体的例子展示其用法和灵活性。 基础用法 fn main() {let number 31;if number <…