Leetcode 第 374 场周赛题解

Leetcode 第 374 场周赛题解

  • Leetcode 第 374 场周赛题解
    • 题目1:2951. 找出峰值
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:2952. 需要添加的硬币的最小数量
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:2953. 统计完全子字符串
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:2954. 统计感冒序列的数目
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 374 场周赛题解

题目1:2951. 找出峰值

思路

遍历。

代码

/** @lc app=leetcode.cn id=2951 lang=cpp** [2951] 找出峰值*/// @lc code=start
class Solution
{
public:vector<int> findPeaks(vector<int> &mountain){vector<int> peaks;for (int i = 1; i < mountain.size() - 1; i++)if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i + 1])peaks.push_back(i);return peaks;}
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目2:2952. 需要添加的硬币的最小数量

思路

贪心。

为方便处理,首先将数组 coins 按升序排序,然后计算需要添加的硬币的最小数量。

关键结论:对于正整数 x,如果区间 [1,x−1] 内的所有金额都可取得,且 x 在数组中,则区间 [1,2x−1] 内的所有金额也都可取得。

假设金额 x 不可取得,则至少需要在数组中添加一个小于或等于 x 的数,才能取得 x,否则无法取得 x。

如果区间 [1,x−1] 内的所有金额都可取得,则从贪心的角度考虑,添加 x 之后即可取得 x,且满足添加的金额个数最少。在添加 x 之后,区间 [1,2x−1] 内的所有金额都可取得,下一个不可取得的金额一定不会小于 2x。

由此可以提出一个贪心的方案。每次找到不可取得的最小的金额 x,在数组中添加 x,然后寻找下一个不可取得的最小的整数,重复上述步骤直到区间 [1,target] 中的所有金额都可取得。

代码

/** @lc app=leetcode.cn id=2952 lang=cpp** [2952] 需要添加的硬币的最小数量*/// @lc code=start
class Solution
{
public:int minimumAddedCoins(vector<int> &coins, int target){sort(coins.begin(), coins.end());int x = 1, index = 0;int ans = 0;while (x <= target){if (index < coins.size() && coins[index] <= x){// 可取得的区间从 [1, x−1] 扩展到 [1, x+coins[index]−1]x += coins[index];index++;}else{// 可取得的区间从 [1, x−1] 扩展到 [1, 2x-1]x = 2 * x;ans++;}}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(nlogn+log(target)),其中 n 是数组 coins 的长度,target 是给定的正整数。将数组 coins 排序需要 O(nlog⁡n) 的时间,排序后需要遍历数组中的 n 个元素,以及更新 x 的值,由于 x 的值上限为 target,因此对 x 的值乘以 2 的操作不会超过 log⁡(target) 次,故时间复杂度是 O(n+log(⁡target))。

空间复杂度:O(logn),其中 n 是数组 coins 的长度。主要为排序的递归调用栈空间。

题目3:2953. 统计完全子字符串

思路

分组循环 + 滑动窗口。

「相邻字母相差至多为 2」这个约束把 word 划分成了多个子串 s,每个子串分别处理。可以用分组循环找到每个子串 s。

对于每个子串,由于每个字符恰好出现 k 次,我们可以枚举有 m 种字符,这样问题就变成了:

长度固定为 m*k 的滑动窗口,判断每种字符是否都出现了恰好 k 次。

代码

/** @lc app=leetcode.cn id=2953 lang=cpp** [2953] 统计完全子字符串*/// @lc code=start
class Solution
{
public:int countCompleteSubstrings(string word, int k){int n = word.size();int ans = 0;for (int i = 0; i < n;){int start = i;i++;while (i < n && abs(int(word[i]) - int(word[i - 1])) <= 2)i++;ans += countCompleteStrings(word.substr(start, i - start), k);}return ans;}// 辅函数 - 计算字符串 s 中完全子字符串的个数int countCompleteStrings(string s, int k){int count = 0;for (int m = 1; m <= 26 && m * k <= s.length(); m++){vector<int> alphaCount(26, 0);// 判断每种字符是否都出现了恰好 k 次auto check = [&]() -> bool{for (int i = 0; i < 26; i++){if (alphaCount[i] && alphaCount[i] != k)return false;}return true;};// 滑动窗口// for (int right = 0; right < s.length(); right++)// {//     alphaCount[s[right] - 'a']++;//     int left = right + 1 - m * k;//     if (left >= 0)//     {//         if (check())//             count++;//         alphaCount[s[left] - 'a']--;//     }// }for (int i = 0; i < m * k; i++)alphaCount[s[i] - 'a']++;if (check())count++;for (int right = m * k; right < s.length(); right++){alphaCount[s[right] - 'a']++;alphaCount[s[right - m * k] - 'a']--;if (check())count++;}}return count;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n∣Σ∣2),其中 n 为字符串 word 的长度,∣Σ∣ 为字符集合的大小,本题中字符均为小写英文字母,所以 ∣Σ∣=26。

空间复杂度:O(∣Σ∣)。忽略切片开销。

题目4:2954. 统计感冒序列的数目

思路

题解:组合数学题,附模板(Python/Java/C++/Go)

代码

/** @lc app=leetcode.cn id=2954 lang=cpp** [2954] 统计感冒序列的数目*/// @lc code=startconst static int MOD = 1e9 + 7;
const static int MX = 1e5;long long q_pow(long long x, int n)
{long long res = 1;for (; n > 0; n /= 2){if (n % 2){res = res * x % MOD;}x = x * x % MOD;}return res;
}// 组合数模板
long long fac[MX], inv_fac[MX];auto init = []
{fac[0] = 1;for (int i = 1; i < MX; i++){fac[i] = fac[i - 1] * i % MOD;}inv_fac[MX - 1] = q_pow(fac[MX - 1], MOD - 2);for (int i = MX - 1; i > 0; i--){inv_fac[i - 1] = inv_fac[i] * i % MOD;}return 0;
}();long long comb(int n, int k)
{return fac[n] * inv_fac[k] % MOD * inv_fac[n - k] % MOD;
}class Solution
{
public:int numberOfSequence(int n, vector<int> &sick){int m = sick.size();int total = n - m;long long ans = comb(total, sick[0]) * comb(total - sick[0], n - sick.back() - 1) % MOD;total -= sick[0] + n - sick.back() - 1;int e = 0;for (int i = 0; i < m - 1; i++){int k = sick[i + 1] - sick[i] - 1;if (k){e += k - 1;ans = ans * comb(total, k) % MOD;total -= k;}}return ans * q_pow(2, e) % MOD;}
};
// @lc code=end

复杂度分析

时间复杂度:O(m),其中 m 为数组 sick 的长度。预处理的时间忽略不计。

空间复杂度:O(1)。预处理的空间忽略不计。

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

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

相关文章

Excel 插件:ASAP Utilities Crack

ASAP Utilities是一款功能强大的 Excel 插件&#xff0c;填补了 Excel 的空白。在过去的 20 年里&#xff0c;我们的加载项已经发展成为世界上最受欢迎的 Microsoft Excel 加载项之一。 ASAP Utilities 中的功能数量&#xff08;300 多个&#xff09;可能看起来有点令人眼花缭乱…

(python)Pyinstaller使用以及相关问题

前言 PyInstaller 可以将 Python 程序打包为独立的可执行文件&#xff0c;不需要用户手动安装 Python 和相关依赖。这使得分发和部署变得更加简单&#xff0c;方便将 Python 程序交付给其他用户或客户。 安装 pip install pyinstaller 相关参数 -F 或 --onefile&#xff1a;…

pdf格式转换为txt格式

pdf文档转换为txt文档 首先在python3虚拟环境中安装PyPDF2 Python 3.6.8 (default, Jun 20 2023, 11:53:23) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux Type "help", "copyright", "credits" or "license" for more infor…

答案解析——C语言—第2次作业:转义字符

本次作业的链接如下&#xff1a;C语言—第2次作业&#xff1a;转义字符 1.下面哪个不是C语言内置的数据类型&#xff1a; C char //字符数据类型short //短整型int //整形long //长整型long long //更长的整形float //单精度浮点数double //双精度浮点数 …

PNG图片导入Abaqus建模:Abaqus Image To Part 2D插件

插件介绍 Abaqus Image To Part 2D - AbyssFish 插件可将图像导入Abaqus内并通过对网格单元集进行材料指定&#xff0c;实现基于图像的模型部件生成。 插件支持JPEG、JPG、PNG、GIF、TIFF、BMP、PCX、ICO等多种图像格式&#xff0c;兼容彩图、灰度图、二值图像等类型&#x…

docker-简单说说namespace

Linux Namespace 是一种 Linux Kernel 提供的资源隔离方案。使得处于不同namespace的进程拥有独立的全局系统资源&#xff0c;改变一个namespace中的系统资源只会影响当前namespace里的进程&#xff0c;对其他namespace中的进程没有影响。 我们可以通过 ls -l /proc/$$/ns 查看…

一起学docker(六)| Dockerfile自定义镜像 + 微服务模块实战

DockerFile 是什么 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 构建步骤 编写Dockerfile文件docker build命令构建镜像docker run运行镜像 Dockerfile构建过程 基础知识 每个保留字指令都必须为大写字母且后面…

【操作系统习题】操作系统的引论

一、单选题 批处理系统的主要缺点是&#xff1a;A A、缺乏交互性 B、CPU的利用率不高 C、不具备并行性 D、内存利用率低操作系统是一组&#xff08;&#xff09;B A、设备管理程序 B、资源管理程序 C、中端处理程序 D、文件管理程序下列选项中&#xff0c;不可能在用户态发生的…

5.云原生安全之ingress配置域名TLS证书

文章目录 cloudflare配置使用cloudflare托管域名获取cloudflare API Token在cloudflare中配置SSL/TLS kubesphere使用cert-manager申请cloudflare证书安装证书管理器创建Secret资源创建cluster-issuer.yaml创建cert.yaml申请证书已经查看申请状态 部署harbor并配置ingress使用证…

Alibaba Cloud Linux镜像操作系统超详细测评!兼容CentOS

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版&#xff0c;针对阿里云服务器ECS做了大量深度优化&#xff0c;Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS&#xff0c;Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…

PET塑料粘接时,要求强力粘接性能,那么怎么选胶呢?

聚对苯二甲酸乙二醇酯 简称PET。 需要强力粘接塑料PET时&#xff0c;可以选择以下几种胶水&#xff1a; 1.环氧树脂胶 具有较高的强度&#xff0c;硬度和耐久性&#xff0c;能够有效地粘合PET材料。但是&#xff0c;对于某些特殊环境和温度条件&#xff0c;可能需要选择耐高…

QT_01 安装、创建项目

QT - 安装、创建项目 1. 概述 1.1 什么是QT Qt 是一个跨平台的 C图形用户界面应用程序框架。 它为应用程序开发者提供建立艺术级图形界面所需的所有功能。 它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 1.2 发展史 1991 年 Qt 最早由奇…

基于Java校园考试信息系统

基于Java校园考试信息系统 需求介绍 1、用户管理&#xff1a;系统需要提供用户管理功能&#xff0c;包括学生、教师和系统管理员等角色的管理。不同角色具有不同的操作权限。 2、考试管理&#xff1a;系统需要支持考试的创建、发布、安排等功能。管理员可以设置考试科目、考…

数组--238.除自身以外数组的乘积/medium

238.除自身以外数组的乘积 1、题目2、题目分析3、解题步骤4、复杂度最优解代码示例5、抽象与扩展 1、题目 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意…

聊聊分布式会话及实现方案

鲁大猿&#xff0c;寻找精品资料&#xff0c;帮你构建Java全栈知识体系 http://www.jiagoujishu.cn 基础概念 Session Cookie 会话方案比较简单&#xff0c;这里我在网上找了点资料&#xff0c;再回顾下基础吧。 为什么要产生Session http协议本身是无状态的&#xff0c;客户…

数据结构——二叉树四种遍历的实现

目录 一、树的概念 1、树的定义 1&#xff09;树 2&#xff09;空树 3&#xff09;子树 2、结点的定义 1&#xff09;根结点 2&#xff09;叶子结点 3&#xff09;内部结点 3、结点间关系 1&#xff09;孩子结点 2&#xff09;父结点 3&#xff09;兄弟结点 4、树…

Mybatis-plus分页插件PageHelper的两种不同使用方式

最近在写需求的过程中接触到许多的分页&#xff0c;但是对于不同情况下会有不同的分页方法选择&#xff0c;由于目前使用得比较多的是mybatis-plus里面的分页插件&#xff0c;因此通过本文详细了解一下pageHelper的使用。 分页最终都是在sql中通过limit完成,limit offset,pageS…

图像分割 分水岭法 watershed

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本文的C#版本请访问&#xff1a;图像分割 分水岭法 watershed&#xff08;C#&#xff09;-CSDN博客 Watershed算法是一种图像处理算…

Linux mcd命令教程:如何在MS-DOS文件系统中切换工作目录(附实例教程和注意事项)

Linux mcd命令介绍 mcd是mtools工具的指令&#xff0c;它用于在MS-DOS文件系统中切换工作目录。如果不加任何参数&#xff0c;它将显示当前所在的磁盘和工作目录。 Linux mcd命令适用的Linux版本 mcd命令在所有主流的Linux发行版中都可以使用&#xff0c;包括但不限于Ubuntu…

Flink 的时间属性及原理解析

Flink的API大体上可以划分为三个层次&#xff1a;处于最底层的ProcessFunction、中间一层的DataStream API和最上层的SQL/Table API&#xff0c;这三层中的每一层都非常依赖于时间属性。时间在Flink中的地位如下图所示&#xff1a; 时间属性是流处理中最重要的一个方面&#…