第 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

相关文章

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. 使用前缀索

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1