题目:
给定数组 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]中的最小值。
要求:
如果数组长度为N,请实现时间复杂度为O(N)的解法。
代码:
import java.util.LinkedList;
public class 最大值减去最小值小于或等于num的子数组数量 {
public static int getArrNum(int[] arr, int num) {
if(arr==null||arr.length==0)
return 0;
int L = 0;
int R = 0;
int res = 0;
int len = arr.length;
LinkedList<Integer> min = new LinkedList<Integer>();
LinkedList<Integer> max = new LinkedList<Integer>();
while(L<len)
{
while(R<len)
{
//生成最大值更新结构
while(!max.isEmpty()&&arr[R]>=arr[max.peekLast()])
{
max.pollLast();
}
max.add(R);
//生成最小值更新结构
while(!min.isEmpty()&&arr[R]<=arr[min.peekLast()])
{
min.pollLast();
}
min.add(R);
if(arr[max.peekFirst()]-arr[min.peekFirst()]>num)
{
break;
}
R++;
}
//弹出过期元素L
if(max.peekFirst()==L)
{
max.pollFirst();
}
if(min.peekFirst()==L)
{
min.pollFirst();
}
res+=R-L;
L++;
}
return res;
}
//测试
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int num = 5;
System.out.println(getArrNum(arr, num));
}
}