小B拥有一个数组 a,她使用这个数组构造了一个新数组 b。其中,a[i] 表示在新数组 b 中有 a[i] 个 i+1。例如,若 a = [2, 3, 1],那么新数组 b = [1, 1, 2, 2, 2, 3],因为 a[0] = 2 代表数组 b 中有 2 个 1,a[1] = 3 代表数组 b 中有 3 个 2,a[2] = 1 代表数组 b 中有 1 个 3。
现在,你需要帮助小B求出 b 数组中所有连续子数组的极差之和。由于答案可能非常大,请对 109+7109+7 取模。
数组的极差定义为子数组的最大值减去最小值。 程序 import java.util.ArrayList; import java.util.List;
public class Main { public static int solution(int n, int[] a) { // 构造数组 b List b = new ArrayList<>(); for (int i = 0; i < n; i++) { for (int j = 0; j < a[i]; j++) { b.add(i + 1); } }
// 计算极差之和
int sum = 0;
int mod = 1000000007;
for (int i = 0; i < b.size(); i++) {
for (int j = i; j < b.size(); j++) {
// 计算子数组 [i, j] 的极差
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int k = i; k <= j; k++) {
max = Math.max(max, b.get(k));
min = Math.min(min, b.get(k));
}
sum = (sum + (max - min)) % mod;
}
}
return sum;
}
public static void main(String[] args) {
System.out.println(solution(2, new int[]{2, 1}) == 2);
System.out.println(solution(3, new int[]{1, 2, 1}) == 6);
System.out.println(solution(4, new int[]{2, 3, 1, 1}) == 26);
}
}