题目: 给定数组arr和整数num,返有多少个连续子数组满足如下情况:
max(arr[i...j]) - min(arr[i...j]) <= num
max(arr[i...j]) 表示连续子数组arr[i...j]中的最大值,min(arr[i...j])表示连续子数组arr[i...j]中的最小值。
题目来源:程序员代码面试指南,P31.
要求线性时间求解。
分析:实现我们可以很容易的写出O(N^3)的代码,两层遍历所有的连续子数组arr[i...j],在一层遍历arr[i...j]的最大值与最小值。这种我们就不在写代码了。稍微优化一下就是,O(N^2),就是在第二层遍历的时候,我们就可以维护最大值与最小值了,这样就不用再加一层循环来查找arr[i...j]内的最大值与最小值了,代码如下:
public int getNum(int[] arr, int num) {
if (arr == null || arr.length < 1) {
return 0;
}
int res = 0;
for (int i = 0; i < arr.length; i++) {
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int j = i; j < arr.length; j++) {
min = Math.min(