大厂真题:【前缀和】米哈游2023秋招-米小游的极差之和

题目描述与示例

题目描述

米小游拿到了一个数组a,她用这个数组构造一个新数组b,其中ai代表b数组中有aii

例如,若a = [2,3,1],那么b = [1,1,2,2,2,3],因为a1=2,代表b 数组中有21a2=3,代表b数组中有32a3 = 1,代表b数组中有13

现在给定a数组,你需要帮米小游求出b数组中所有连续子数组的极差之和。由于答案可能过大,请对10^9+7 取模。

数组的极差指最大值减去最小值。

输入描述

第一行输入一个正整数n,代表a数组的元素数量。

第二行输入n 个正整数ai,代表a数组的元素。

复制代码
1 ≤ n ≤ 10^5
1 ≤ ai ≤ 10^9

输出描述

一个整数,代表数组中所有区间的极差之和,对10^9+7取模的值。

示例

输入

Plain 复制代码
2
2 1

输出

Plain 复制代码
2

说明

a=[2,1]时,b数组为[1,1,2]。

此时b数组共有6个连续子数组:

1\]的极差为0。 \[1\]的极差为0。 \[2\]的极差为0。 \[1,1\]的极差为0。 \[1,2\]的极差为1。 \[1,1,2\]的极差为1。 因此答案是0+0+0+0+1+1=2。 ## 解题思路 根据数据范围大小,显然不能将`a`数组展开回`b`数组求解,而应该直接从`a`数组出发解决问题。 注意到`b`数组实际上是一个单调非递减数组,其子数组也一定单调非递减数组。当子数组的最大值和最小值不相等(即最后一个元素和第一个元素)时,该子数组才对极差有贡献。 对于任意的两元组 ( i , j ) (i, j) (i,j)满足 1 \< = i \< j \< = n 1 \<= i \< j \<= n 1\<=i\ #include #include using namespace std; int main() { int n; cin >> n; vector a_list(n); const int MOD = 1000000007; long long ans = 0; for (int i = 0; i < n; i++) { cin >> a_list[i]; } vector p_list(n + 1, 0); vector q_list(n + 1, 0); for (int i = 1; i <= n; i++) { p_list[i] = p_list[i - 1] + static_cast(i) * a_list[i - 1]; q_list[i] = q_list[i - 1] + a_list[i - 1]; } long long pn = p_list[n]; long long qn = q_list[n]; for (int i = 1; i <= n; i++) { ans += static_cast(a_list[i - 1]) * (pn - p_list[i] - (qn - q_list[i]) * i); ans %= MOD; } cout << ans << endl; return 0; } ``` ### 时空复杂度 时间复杂度:`O(N)`。化简后,仅需一次遍历数组。 空间复杂度:`O(N)`。两个后缀和数组所占用空间。 ## 华为OD算法/大厂面试高频题算法练习冲刺训练 * **华为OD算法/大厂面试高频题算法冲刺训练**目前开始常态化报名!目前已服务100+同学成功上岸! * 课程讲师为全网50w+粉丝编程博主@**吴师兄学算法** 以及小红书头部编程博主@**闭着眼睛学数理化** * 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果! * 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁 * 可上全网独家的[欧弟OJ系统](https://oj.algomooc.com/)练习华子OD、大厂真题 * 可查看链接 [OD算法冲刺训练课程表](https://r07na4yqwor.feishu.cn/docx/I0Ued47QAojP1ax1dn5cRFZBnCd) \& [OD真题汇总(持续更新)](https://og7kl7g6h8.feishu.cn/docx/Vmu8dqCQYoOzmExswVpc97gknRh) * 绿色聊天软件戳 `od1336`了解更多

相关推荐
程序员徐师兄1 小时前
Windows JDK11 下载安装教程,适合新手
java·windows·jdk11 下载安装·jdk11 下载教程
rayufo1 小时前
【工具】列出指定文件夹下所有的目录和文件
开发语言·前端·python
RANCE_atttackkk1 小时前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
数研小生2 小时前
构建命令行单词记忆工具:JSON 词库与艾宾浩斯复习算法的完美结合
算法·json
芒克芒克2 小时前
LeetCode 题解:除自身以外数组的乘积
算法·leetcode
五岳2 小时前
DTS按业务场景批量迁移阿里云MySQL表实战(下):迁移管理平台设计与实现
java·应用·dts
zhougl9962 小时前
Java 所有关键字及规范分类
java·开发语言
Python 老手2 小时前
Python while 循环 极简核心讲解
java·python·算法
@Aurora.2 小时前
优选算法【专题九:哈希表】
算法·哈希算法·散列表
java1234_小锋2 小时前
Java高频面试题:MyISAM索引与InnoDB索引的区别?
java·开发语言