LeetCode)
1 题目描述( 今天课有点多晚上才有时间刷题,因此该文也尽可能简短节约时间,只作为本人打卡使用。
ok这是LeetCode每日一题,题目描述如下:
也就是给定一个为原数组相邻元素差值的数组,以及一个闭区间,要求还原所有可能的数组,且数组中的数在闭区间内。
2 题目解决
首先写了一个暴力方法,结果就是超时了。因此需要使用别的算法。这里仔细观察了定义的differences
数组,我们可以发现,若原数组为[a,b,c,d]
,则differences
为[b-a,c-b,d-c]
,这样我们就发现,若想计算不相邻元素的差值,只需将differences
对应位置相加即可。例如计算d-b=differences[2]+differences[1]
。所以我们可以固定一个元素,不妨为隐藏数组的第一个值,我们不需要知道它的具体值,只需要计算其余元素与其的差值,即可判断出隐藏数组中的最大值和最小值(通过将differences
不断累加即可),以及最大值与最小值之间的固定差值。有了这个信息,我们只需要保证最大最小值在区间内,且它们差值为所求的固定差值,通过滑动最大最小值即可求出隐藏数组的个数。
注意隐藏数组累加数比较大,用int
溢出了,因此用long long
成功通过:
class Solution {
public:
int numberOfArrays(vector<int>& differences, int lower, int upper) {
int ans=0;
int n=differences.size();
//记录与hidden[0]的最大差值,也就是hidden的最大值
long long hidden_max=0;
//记录与hidden[0]的最小差值,也就是hidden的最小值
long long hidden_min=0;
long long diff_sum=0;
for(int i=0;i<n;i++){
diff_sum=diff_sum+differences[i];
hidden_max=max(hidden_max,diff_sum);
hidden_min=min(hidden_min,diff_sum);
}
//保证最大值与最小值在区间内,且二者的差值固定即可
ans=upper-lower-(hidden_max-hidden_min)+1;
return ans>0?ans:0;
}
};
可以看到时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。今天就到这里,主播继续刷题复习去了。。。