【Leetcode 每日一题】2145. 统计隐藏数组数目
问题背景
给你一个下标从 0 0 0 开始且长度为 n n n 的整数数组 d i f f e r e n c e s differences differences,它表示一个长度为 n + 1 n + 1 n+1 的 隐藏 数组 相邻 元素之间的 差值 。更正式的表述为:我们将隐藏数组记作 h i d d e n hidden hidden,那么 d i f f e r e n c e s [ i ] = h i d d e n [ i + 1 ] − h i d d e n [ i ] differences[i] = hidden[i + 1] - hidden[i] differences[i]=hidden[i+1]−hidden[i]。
同时给你两个整数 l o w e r lower lower 和 u p p e r upper upper,它们表示隐藏数组中所有数字的值都在 闭 区间 [ l o w e r , u p p e r ] [lower, upper] [lower,upper] 之间。
- 比方说, d i f f e r e n c e s = [ 1 , − 3 , 4 ] differences = [1, -3, 4] differences=[1,−3,4], l o w e r = 1 lower = 1 lower=1, u p p e r = 6 upper = 6 upper=6,那么隐藏数组是一个长度为 4 4 4 且所有值都在 1 1 1 和 6 6 6(包含两者)之间的数组。
- [ 3 , 4 , 1 , 5 ] [3, 4, 1, 5] [3,4,1,5] 和 [ 4 , 5 , 2 , 6 ] [4, 5, 2, 6] [4,5,2,6] 都是符合要求的隐藏数组。
- [ 5 , 6 , 3 , 7 ] [5, 6, 3, 7] [5,6,3,7] 不符合要求,因为它包含大于 6 6 6 的元素。
- [ 1 , 2 , 3 , 4 ] [1, 2, 3, 4] [1,2,3,4] 不符合要求,因为相邻元素的差值不符合给定数据。
请你返回 符合 要求的隐藏数组的数目。如果没有符合要求的隐藏数组,请返回 0 0 0。
数据约束
- n = d i f f e r e n c e s . l e n g t h n = differences.length n=differences.length
- 1 ≤ n ≤ 1 0 5 1 \le n \le 10 ^ 5 1≤n≤105
- − 1 0 5 ≤ d i f f e r e n c e s [ i ] ≤ 1 0 5 -10 ^ 5 \le differences[i] \le 10 ^ 5 −105≤differences[i]≤105
- − 1 0 5 ≤ l o w e r ≤ u p p e r ≤ 1 0 5 -10 ^ 5 \le lower \le upper \le 10 ^ 5 −105≤lower≤upper≤105
解题过程
隐藏数组数组中的所有元素,都可以由数组的首项与 d i f f e r e n c e s differences differences 数组中对应位置的元素求和得到。
要确定有多少可能的数组,只需要计算有哪些可能的首项即可。
要求数组中每个元素都在给定范围内,实际上会得到一系列不等式,最终首项的范围是 [ l o w e r − m i n , u p p e r − m a x ] [lower - min, \ upper - max] [lower−min, upper−max],其中 m i n min min 和 m a x max max 分别表示所给数组的前缀和数组的最小最大值。
具体实现
class Solution {public int numberOfArrays(int[] differences, int lower, int upper) {long preSum = 0, min = 0, max = 0;for (int diff : differences) {preSum += diff;min = Math.min(min, preSum);max = Math.max(max, preSum);}return (int) Math.max(upper - lower - max + min + 1, 0);}
}