前置知识:差分数组前缀和后变成原数组,原数组差分后变成差分数组。
原数组前缀和后变成前缀和数组,前缀和数组差分后变成原数组。
比如说差分数组是diff,前缀和数组是pre,原数组是a
那么就有diff[1]= a[0]+a[1],a[1] = a[0] + diff[1],pre[1]=pre[0]+a[1].
这个式子可以变成通式的。
有一个自行车手打算进行一场公路骑行,这条路线总共由 n + 1
个不同海拔的点组成。自行车手从海拔为 0
的点 0
开始骑行。
给你一个长度为 n
的整数数组 gain
,其中 gain[i]
是点 i
和点 i + 1
的 净海拔高度差(0 <= i < n
)。请你返回 最高点的海拔 。
示例 1:
输入:gain = [-5,1,5,0,-7] 输出:1 解释:海拔高度依次为 [0,-5,-4,1,1,-6] 。最高海拔为 1 。
示例 2:
输入:gain = [-4,-3,-2,-1,4,3,2] 输出:0 解释:海拔高度依次为 [0,-4,-7,-9,-10,-6,-3,-1] 。最高海拔为 0 。
提示:
n == gain.length
1 <= n <= 100
-100 <= gain[i] <= 100
解题思路:这个题目的意思就是给你个差分数组要你求原数组。为什么呢?你可以看示例1,相当于原数组的元素-5 = 0+-5.这个比较特殊,可以比较后面的,也是一样的。所以相当于gain就是差分数组,所以我们现在可以定义一个数组nums为原数组,根据差分的公式nums[i] = nums[i-1]+gain[i],就可以计算出原数组,最好每计算一个就比较一下,注意,一定要让原数组的第一个元素为0,这是题目的条件。所以循环从1开始,到gain的最后元素为止,此时我们就求出了原数组前gainSize+1个元素的值了 ,这是模板题,适合多练几次。
代码:
int largestAltitude(int* gain, int gainSize) {
int nums[105] = {0};
int max = 0;
for(int i = 1;i <= gainSize;i++){
nums[i] = nums[i-1] + gain[i-1];
max = nums[i]>max?nums[i]:max;
}
return max;
}