华为机试题:求子区间面积和
题目内容
小A发明了一个游戏,有一串连续的数字用数组arr表示,arr[0...N-1]
,0 < N =< 100000,定义任意子区间 arr[i...j]
,0 =< i =< j =< N-1,区间的面积为该区间的最大值减去区间最小值,然后乘以区间的长度(j - i + 1),这个游戏的获胜条件为需要计算出所有子区间面积和,由于面积会很大,结果返回面积和对 1000000007 取模后的值(ares_num % 1000000007)。
输入描述:
输入第一行只有一个参数N,为数组长度,0 < N =< 100000
第二行给出数组的各数字元素,数组元素 arr[i] 满足 0 < arr[i] =< 100000
输出描述:
输出所有子区间面积之和 mod 1000000007
测试用例
用例1:
输入
3
1 4 2000
输出
9995
说明
子区间有三个:
1 4 面积 (4 - 1) * 2 = 6
4 2000 面积 (2000 - 4) * 2 = 3992
1 4 2000 面积 (2000 - 1) * 3 = 5997
9995 % 1000000007 = 9995
时间复杂度O()的解法:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int size = Integer.parseInt(scanner.nextLine());
String line = scanner.nextLine();
int[] numbers = Arrays.stream(line.split(" ")).mapToInt(Integer::parseInt).toArray();
areaSum(size, numbers);
}
public static void areaSum(int n, int[] arr) {
int sum = 0;
for (int i = 0; i < n - 1; i++) {
int max = arr[i]; // 初始化 arr[i...j] 的最大值为 arr[i]
int min = arr[i]; // 初始化 arr[i...j] 的最小值为 arr[i]
int area_sum;
for (int j = i + 1; j < n; j++) {
max = Math.max(max, arr[j]); // 更新 arr[i...j] 的最大值
min = Math.min(min, arr[j]); // 更新 arr[i...j] 的最小值
area_sum = (max - min) * (j - i + 1) % 1000000007;
sum = (sum + area_sum) % 1000000007;
}
}
System.out.println(sum);
}
}
参考同余定理:(a + b) % n = ((a % n ) + (b % n)) % n
自编用例
输入
3
1 100000 2
输出
699991
面积和等于
(100000-1)*2 + (100000 - 1) * 3 + (100000 - 2) * 2 = 699991
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix