第 374 场周赛 解题报告 | 珂学家 | 拆位前缀和优化+分组滑窗+组合数学

本文主要是介绍第 374 场周赛 解题报告 | 珂学家 | 拆位前缀和优化+分组滑窗+组合数学,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


前言

在这里插入图片描述


整体评价

这场挺难的,2题手速快的话,也能排一个好的名次。

T3是道经典的题,可以借助拆位前缀和来优化,不过整体的时间复杂度也算蛮高了,好像卡c++的常数了。

T4的组合数学好像超纲了,不过力扣周赛是考过几回了,属于常规超纲知识点。


T1. 找出峰值

class Solution {public List<Integer> findPeaks(int[] mountain) {List<Integer> res = new ArrayList<>();for (int i = 1; i < mountain.length - 1; i++) {if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i + 1]) res.add(i);}return res;}
}

T2. 需要添加的硬币的最小数量

这题是结论题:

前缀和大于等于某个数,可以吸纳于集合中,并能自由组合构建 1 N 的数 前缀和大于等于某个数,可以吸纳于集合中,并能自由组合构建1~N的数 前缀和大于等于某个数,可以吸纳于集合中,并能自由组合构建1 N的数

class Solution {public int minimumAddedCoins(int[] coins, int target) {        Arrays.sort(coins);int res = 0;int s = 0;for (int i = 0; s < target && i < coins.length; i++) {while (s < target && s + 1 < coins[i]) {s += s + 1;res++;}s += coins[i];}while (s < target) {s += s + 1;res++;}return res;}
}

T3. 统计完全子字符串

思路: 拆位+前缀和

时间复杂度相对有些高, O ( 2 6 2 ∗ n ) O(26^2 * n) O(262n)

class Solution {public int countCompleteSubstrings(String word, int k) {char[] str = word.toCharArray();int n = str.length;int[] valid = new int[n + 1];int[][] pre = new int[26][n + 1];for (int i = 0; i < n; i++) {int p = str[i] - 'a';for (int j = 0; j < 26; j++) {pre[j][i + 1] = pre[j][i] + (p == j ? 1 : 0);}if (i + 1 < n) {int t = Math.abs(str[i] - str[i + 1]);valid[i + 1] = valid[i] + (t > 2 ? 1 : 0);}}int res = 0;for (int i = 0; i < n; i++) {for (int j = i - k + 1; j >= 0; j -= k) {int s = valid[i] - valid[j];if (s == 0) {int t0 = 0, t1 = 0;for (int t = 0; t < 26; t++) {int x = pre[t][i + 1] - pre[t][j];if (x > 0 && x < k) t0++;else if (x > k) {t1++;break;}}if (t1 > 0) {break;} else if (t0 == 0) {res++;}} else {break;}}}return res;}
}

T4. 统计感冒序列的数目

思路: 组合数学

如果一时找不到规律,按照灵神的建议

可以从特殊到一般 可以从特殊到一般 可以从特殊到一般

对于一个区间(长度为m)

  • 内部的选择是 2 ( m − 1 ) 2^(m-1) 2(m1)
  • 最左侧/右侧为1

而从全局来看

区间和区间之间,它满足如下公式

C ( n 1 , n 1 ) ∗ C ( n 1 + n 2 , n 2 ) ∗ . . . ∗ C ( n 1 + n 2 + . . . + n t , n t ) C(n_1, n_1) * C(n_1 + n_2, n_2) * ... * C(n_1+n_2+...+n_t, n_t) C(n1,n1)C(n1+n2,n2)...C(n1+n2+...+nt,nt)

最终的结果即乘法原理

内部和全局累乘即可 内部和全局累乘即可 内部和全局累乘即可

剩下的就是组合计算的板子题

对于n在 ( 1 0 6 ) (10^6) (106)范围内,p很大(质数),一般采用预处理

这样的话,整个复杂度为 O ( n ) O(n) O(n)


class Solution {static long mod = (long)1e9 + 7l;static int SZ = 10_0000;static long[] fac = new long[SZ + 1];static long[] inv = new long[SZ + 1];static {fac[0] = 1;for (int i = 1; i <= SZ; i++) {fac[i] = fac[i - 1] * i % mod;}// 费马小定理inv[SZ] = ksm(fac[SZ], mod - 2);for (int j = SZ - 1; j >= 0; j--) {inv[j] = inv[j + 1] * (j + 1) % mod;}}// *) static long ksm(long b, long v) {long r = 1;while (v > 0) {if (v % 2 == 1) {r = r * b % mod;}v /= 2;b = b * b % mod;}return r;}long comb(int n, int k) {return fac[n] * inv[n - k] % mod * inv[k] % mod;}public int numberOfSequence(int n, int[] sick) {int holes = 0;long r = 1;holes += sick[0];for (int i = 0; i < sick.length - 1; i++) {int span = sick[i + 1] - sick[i] - 1;if (span > 0) {r = r * ksm(2, span - 1) % mod;holes += span;r = r * comb(holes, span) % mod;}}int m = sick.length;if (sick[m - 1] < n) {int span = (n - sick[m - 1] - 1);holes += span;r = r * comb(holes, span) % mod;}return (int)r;}}

写在最后

在这里插入图片描述

这篇关于第 374 场周赛 解题报告 | 珂学家 | 拆位前缀和优化+分组滑窗+组合数学的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/548820

相关文章

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

正则表达式r前缀使用指南及如何避免常见错误

《正则表达式r前缀使用指南及如何避免常见错误》正则表达式是处理字符串的强大工具,但它常常伴随着转义字符的复杂性,本文将简洁地讲解r的作用、基本原理,以及如何在实际代码中避免常见错误,感兴趣的朋友一... 目录1. 字符串的双重翻译困境2. 为什么需要 r?3. 常见错误和正确用法4. Unicode 转换的

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

Java如何根据文件名前缀自动分组图片文件

《Java如何根据文件名前缀自动分组图片文件》一大堆文件(比如图片)堆在一个目录下,它们的命名规则遵循一定的格式,混在一起很难管理,所以本文小编就和大家介绍一下如何使用Java根据文件名前缀自动分组图... 目录需求背景分析思路实现代码输出结果知识扩展需求一大堆文件(比如图片)堆在一个目录下,它们的命名规

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索