题目描述
在监控与BI报表系统中,我们经常会采集数据指标进行分析,这里的数据往往都是时序数据,对于时序数据,我们可以用一个数组来表示,例如数组下标表示时间顺序,数组的值表示采集的指标数据大小。现在作为分析师的你,得到如下一个任务:在给定一个整数形式的时序数据,求出这个时序里最大的振幅(“落差”)(振幅 = 时序里相邻的“波峰”与“波谷”相差绝对值)
输入描述
一个数组,下标代表x轴的时间顺序,数组里的每个数值代表y轴的具体值
输出描述
整个曲线的相邻波峰与波谷的最大振幅落差
样例输入
1,2,3,8,5,3,6
2,2,3,8,8,6,5,10,7,6
1,2,3,4,5,6
样例输出
7
6
5
双指针
import java.util.Scanner;
public class Main {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String[] nums_str = sc.nextLine().split(",");
int[] nums = new int[nums_str.length];
for (int i = 0; i < nums_str.length; i++) {
nums[i] = Integer.parseInt(nums_str[i]);
}
int start = 0, i = 1, j = 2;
// start 是本次波的起点(单独的一次上升波,或者是下降波)
// i 和 j 是用来比较两个数的,其实 j==i+1,代码懒得改了
int ans = 0, diff = nums[1]-nums[0];
// ans 就是最大的振幅,diff 是两个数之间的差值
while(i <= j && j < nums.length){
if((nums[j] - nums[i]) * diff > 0){ // 如果当前两个数的差值和之前的差值相乘为正,说明现在方向没变(连续上升,或是连续下降)
j++; // 更新指针,向前,匹配前面的数
i++; // 同上
}else{
ans = Math.max(ans, nums[j-1] - nums[start]); // 如果方向发生了改变,那么就获取本次上升或下降的振幅(最末尾的地方 - 起始的地方)
diff = nums[j] - nums[i]; // 更新差值,为下一次判断方向做准备
start = i; // 更新本次上升或下降的起点
i = j; // 更新指针
j = i + 1; // 更新指针
}
}
if(start == 0){ // 如果一直是上升,或是下降
System.out.println(nums[nums.length-1] - nums[0]);
}else{
System.out.println(ans);
}
}
}
}