描述
给定数组arr和整数num,求arr的连续子数组中满足:其最大值减去最小值的结果大于num的个数。
输入
输入第一行为测试用例个数。每一个用例有若干行,第一行为数组,每一个数用空格隔开,第二行为num。
输出
输出一个值。
输入样例 1
1
3 6 4 3 2
2
输出样例 1
6
普通实现
import java.util.Scanner;
public class ValueRangeOfSubarray {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int numOfCases = Integer.parseInt(scanner.nextLine()); // 测试用例数量
// 对每个测试用例的处理
for (int i = 0; i < numOfCases; i++) {
String[] temp = scanner.nextLine().split(" "); // 获取要处理的数字数组
int maxLenOfArr = temp.length; // 数组数字数量 或 数组最大长度
int[] numArray = new int[maxLenOfArr];
for (int j = 0; j < maxLenOfArr; j++) {
numArray[j] = Integer.parseInt(temp[j]);
}
int sampleRange = Integer.parseInt(scanner.nextLine()); // 整数num
int result = 0; // 统计结果
int windowSize = 2; // 窗口大小,最小为2
while (windowSize <= maxLenOfArr) { // 当窗口没超过最大时
for (int j = 0; j < maxLenOfArr-1; j++) {
if (j+windowSize > maxLenOfArr) {
break;
}
if (getValueRange(numArray, j, j+windowSize) > sampleRange) {
result++;
}
}
windowSize++;
}
System.out.println(result);
}
scanner.close();
}
// 求该子数组取值范围
public static int getValueRange(int[] arr, int start, int end) {
int max = arr[start];
int min = arr[start];
for (int i = start; i < end; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
return max-min;
}
}
进阶要求
实现一个时间复杂度为O(length(arr))的算法。