Leetcode 第 380 场周赛题解

Leetcode 第 380 场周赛题解

  • Leetcode 第 380 场周赛题解
    • 题目1:3005. 最大频率元素计数
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3006. 找出数组中的美丽下标 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3007. 价值和小于等于 K 的最大数字
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3008. 找出数组中的美丽下标 II
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 380 场周赛题解

题目1:3005. 最大频率元素计数

思路

遍历数组 nums,统计各元素 num 的出现次数,存储在哈希表 cnt 中。

初始化 sum = 0,max_freq = 0。

遍历哈希表 cnt:

  1. 如果当前 freq > max_freq,则令 max_freq = freq,sum 归 0 后重新加一个 freq(sum = freq)。
  2. 如果当前 freq = max_freq,则 sum += freq。

答案为 sum。

代码

/** @lc app=leetcode.cn id=3005 lang=cpp** [3005] 最大频率元素计数*/// @lc code=start
class Solution
{
public:int maxFrequencyElements(vector<int> &nums){// 特判if (nums.empty())return 0;unordered_map<int, int> cnt;for (int &num : nums)cnt[num]++;int max_freq = 0, sum = 0;for (auto &[num, freq] : cnt){if (freq > max_freq){max_freq = freq;sum = freq;}else if (freq == max_freq)sum += freq;}return sum;}
};
// @lc code=end

复杂度分析

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

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

题目2:3006. 找出数组中的美丽下标 I

思路

用 C++ 标准库中的字符串查找函数,找到 a 和 b 分别在 s 中的起始下标,将符合要求的下标插入答案。

代码

/** @lc app=leetcode.cn id=3006 lang=cpp** [3006] 找出数组中的美丽下标 I*/// @lc code=start
class Solution
{
public:vector<int> beautifulIndices(string s, string a, string b, int k){// 特判if (s.empty() || a.empty() || b.empty() || k <= 0 || k > s.size())return {};if (s.length() < a.length() || s.length() < b.length())return {};int slen = s.size(), alen = a.size(), blen = b.size();vector<int> indices;for (int i = 0; i <= slen - alen; i++){if (s.substr(i, alen) == a){// 注意减小 j 的取值范围int start = max(0, i - k), end = min(slen, i + k);for (int j = start; j <= end; j++)if (s.substr(j, blen) == b){indices.push_back(i);break;}}}return indices;}
};
// @lc code=end

复杂度分析

时间复杂度:O(slen * alen * blen),其中 slen 是字符串 s 的长度,alen 是字符串 a 的长度,blen 是字符串 b 的长度。

空间复杂度:O(1)。

题目3:3007. 价值和小于等于 K 的最大数字

思路

二分答案 + 数位 DP。

题解:三种方法:二分答案+数位 DP/数学公式/逐位构造(Python/Java/C++/Go)

代码

/** @lc app=leetcode.cn id=3007 lang=cpp** [3007] 价值和小于等于 K 的最大数字*/// @lc code=start// 二分查找 + 数位 DPclass Solution
{
public:long long findMaximumNumber(long long k, int x){long long left = 0, right = (k + 1) << x;while (left + 1 < right){long long mid = left + (right - left) / 2;if (countDigitOne(mid, x) <= k)left = mid;elseright = mid;}return left;}// 辅函数 - 计算所有小于等于 num 的非负整数中的价值总和// 一个整数 num 的价值是满足 i % x == 0 且 s[i] 是 1 的 i 的数目long long countDigitOne(long long num, int x){int m = 64 - __builtin_clzll(num);vector<vector<long long>> memo(m, vector<long long>(m + 1, -1));function<long long(int, int, bool)> dfs = [&](int i, int cnt1, bool is_limit) -> long long{if (i < 0)return cnt1;if (!is_limit && memo[i][cnt1] >= 0)return memo[i][cnt1];int up = is_limit ? num >> i & 1 : 1;long long res = 0;for (int d = 0; d <= up; d++) // 枚举要填入的数字 dres += dfs(i - 1, cnt1 + (d == 1 && (i + 1) % x == 0), is_limit && d == up);if (!is_limit)memo[i][cnt1] = res;return res;};return dfs(m - 1, 0, true);}
};
// @lc code=end

复杂度分析

在这里插入图片描述

题目4:3008. 找出数组中的美丽下标 II

思路

KMP + 二分查找。

KMP 详解:KMP 算法详解(C++ Version)

题解:两种写法:KMP+二分查找/双指针(Python/Java/C++/Go)

代码

/** @lc app=leetcode.cn id=3008 lang=cpp** [3008] 找出数组中的美丽下标 II*/// @lc code=start// KMP + 二分查找class Solution
{
public:vector<int> beautifulIndices(string s, string a, string b, int k){vector<int> posA = kmp(s, a);vector<int> posB = kmp(s, b);vector<int> ans;// 二分查找// for (int i : posA)// {//     auto it = lower_bound(posB.begin(), posB.end(), i);//     if (it != posB.end() && *it - i <= k ||//         it != posB.begin() && i - *--it <= k)//     {//         ans.push_back(i);//     }// }// 双指针int j = 0, m = posB.size();for (int i : posA){while (j < m && posB[j] < i - k)j++;if (j < m && posB[j] <= i + k)ans.push_back(i);}return ans;}// 辅函数 - KMPvector<int> kmp(string &text, string &pattern){int m = pattern.length();vector<int> nxt = getNxt(pattern);vector<int> res;int tar = 0; // 主串中将要匹配的位置int pos = 0; // 模式串中将要匹配的位置while (tar < text.length()){if (text[tar] == pattern[pos]){// 若两个字符相等,则 tar、pos 各进一步tar++;pos++;}else if (pos != 0){// 失配,如果 pos != 0,则依据 nxt 移动标尺pos = nxt[pos - 1];}else{// pos[0] 失配,标尺右移一位tar++;}// pos 走到了 pattern.length(),匹配成功if (pos == pattern.length()){// 保存主串上的匹配起点res.push_back(tar - pos);// 移动标尺pos = nxt[pos - 1];}}return res;}// 辅函数 - 计算 nxt 数组// vector<int> getNxt(string &pattern)// {//     int m = pattern.length();//     vector<int> nxt(m, 0);//     for (int i = 0; i < m; i++)//     {//         string sub = pattern.substr(0, i + 1);//         for (int j = sub.length() - 1; j >= 0; j--)//         {//             string prev = sub.substr(0, j);//             string suf = sub.substr(sub.length() - j, j);//             if (prev == suf)//             {//                 nxt[i] = j;//                 break;//             }//         }//     }//     return nxt;// }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;}
};
// @lc code=end

复杂度分析

时间复杂度:O(nlog⁡n),其中 n 为字符串 text 的长度。

空间复杂度:O(n)。

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

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

相关文章

OCP NVME SSD规范解读-7.TCG安全日志要求

在OCP NVMe SSD规格中&#xff0c;TCG的相关内容涉及以下几个方面&#xff1a; 活动事件记录&#xff1a; NVMe SSD需要支持记录TCG相关的持久事件日志&#xff0c;用于追踪固态硬盘上发生的与TCG安全功能相关的关键操作或状态变化&#xff0c;如启动过程中的安全初始化、密钥…

NetSuite 文心一言(Ernie)的AI应用

有个故事&#xff0c;松下幸之助小时候所处的年代是明治维新之后&#xff0c;大量引用西洋技术的时期。当时大家对“电”能干什么事&#xff0c;充满好奇。“电能干什么&#xff1f;它能帮我们开门么&#xff1f;” 松下幸之助的爷爷对电不屑&#xff0c;于是就问他。松下幸之助…

18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器

18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器 点击button按钮触发事件显示月份与获取的时间 Button button3 (Button) findComponentById(ResourceTable.Id_button3);button3.setClickedListener(new Component.ClickedListener() {Overridepublic void onClick(Compon…

BL120PM PLC网关,实现PLC协议转Modbus协议

随着物联网技术的迅猛发展&#xff0c;人们深刻认识到在智能化生产和生活中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的物联网数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于工业自动化和数字化工厂应用环境中。 钡铼…

muduo网络库剖析——线程Thread类

muduo网络库剖析——线程Thread类 前情从muduo到my_muduo 概要框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xff1b;而作为学习者&#xff0c;我们需要抽取其中的精…

RectMask2D的合批情况验证

1.经过实际测试&#xff0c;RectMask2D在裁剪区域完全相同且位置完全重合的情况下能够合批 但是当RectMask2D位置不重合时&#xff0c;就不能合批 注意&#xff0c;虽然此处被RectMask2D裁剪了&#xff0c;但是有部分是被渲染的&#xff0c;在计算深度时属于需要渲染…

【人工智能大脑】仿生学与人工智能交汇:基于MP神经网络的精准农业实践

MP神经网络&#xff0c;即McCulloch-Pitts模型&#xff08;MCP Model&#xff09;&#xff0c;是神经网络的早期形式之一&#xff0c;由Warren McCulloch和Walter Pitts在1943年提出。这个模型为现代人工神经网络的发展奠定了理论基础&#xff0c;并首次尝试模拟了生物神经元的…

【数据结构】二叉树算法讲解(定义+算法原理+源码)

博主介绍&#xff1a;✌全网粉丝喜爱、前后端领域优质创作者、本质互联网精神、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战✌有需要可以联系作者我哦&#xff01; &#x1f345;附上相关C语言版源码讲解&#x1f345; &#x1f44…

单元化(Set)架构设计详解:异地多活、突破扩展上限的优选方案

文章目录 一、单元化架构基础1、扩展性&#xff08;Scalability&#xff09;概述2、扩展性 - 横向扩展&#xff08;Horizontal Scale&#xff09;3、扩展性 - 纵向扩展&#xff08;Vertical Scale&#xff09;4、扩展性 - 扩展魔方5、一致性 - 数据库事务一致性&#xff08;ACI…

分布式websocket IM聊天系统相关问题问答【第九期】

前言 上期视频讲解了自己关于聊天系统的设计的时候出现了一些不一样的声音。不了解情况的可以看上上期视频。这期主要是讨论。IM聊天系统设计方案多。我的先说明一下自己的技术背景互相之间才能更好的理解。 本期对应视频 目前已经写的文章有。并且有对应视频版本。 git项目地…

PLAN方法:解决 GAN 生成医学图像 Latent 空间中的隐私保护方法

PLAN方法&#xff1a;解决 GAN 生成医学图像 Latent 空间中的隐私保护方法 PLAN 原理StyleGAN 生成视网膜图k-SALSA 生成视网膜图PLAN方法 生成视网膜图 总结 PLAN 原理 论文&#xff1a;https://arxiv.org/abs/2307.02984 代码&#xff1a;https://github.com/perceivelab/P…

Ps:直线工具

使用直线工具 Line Tool&#xff0c;可以绘制直线或带箭头的直线&#xff0c;可以是矢量形状&#xff0c;或者是基于像素的形状&#xff0c;或者是路径&#xff08;形状轮廓&#xff09;。 快捷键&#xff1a;U ◆ ◆ ◆ 常用操作方法与技巧 1、按住 Shift 键拖拽&#xff0c…