算法题-最大值减去最小值小于或等于 num 的子数组数量
2017-08-02 10:54
405 查看
【题目】 给定数组 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; /** * Created by 糖糖 on 2017/8/2. */ public class getnum33 { public static int getnum(int arr[],int num){ LinkedList<Integer> qmin=new LinkedList<>(); LinkedList<Integer> qmax=new LinkedList<>(); int res=0; int i=0; int j=0; while (i<arr.length){ while (j<arr.length){ while (!qmin.isEmpty() && arr[qmin.peekLast()]>= arr[j]) qmin.pollLast(); qmin.addLast(j); while (!qmax.isEmpty() && arr[qmax.peekLast()]<=arr[j]) qmax.pollLast(); qmax.addLast(j); if(arr[qmax.peekFirst()]-arr[qmin.peekFirst()]>num) break; j++; } if(i==qmin.peekFirst()) qmin.pollFirst(); if(i==qmax.peekFirst()) qmax.pollFirst(); res+=j-i; i++; } return res; } public static void main(String args[]){ int arr[]={3,4,5,1,7,8}; System.out.print(getnum(arr,2)); } }
相关文章推荐
- 算法题-最大值减去最小值小于或等于 num 的子数组数量
- 栈和队列---最大值减去最小值小于或等于num的子数组数量
- 最大值减去最小值小于或等于num的子数组数量
- 最大值减去最小值小于或等于num的子数组数量
- 1.10 最大值减去最小值小于或等于num的子数组数量
- 数据结构 最大值减去最小值小于或等于num的子数组数量
- 左神的书——《程序员代码面试指南》之最大值减去最小值小于或等于num的子数组的数量 c++实现
- 最大值减去最小值小于或等于num的子数组数量
- 最大值减去最小值小于等于num的子数组数量
- 【算法】最大值和最小值的差小于或者等于num的子数组数量
- 最大值减去最小值小于或者等于num的子数组数量
- 最大值减去最小值小于或者等于num的子数组数量
- Codeing Interview: 最大值减去最小值小于或者等于num的子数组数量
- 子数组系列二:最大值减去最小值小于或等于 k 的子数组数量
- 滑动窗口变形题-最大值减去最小值小于等于num的子数组
- 栈和队列(8)-- 最大值减去最小值小于或者等于num的子数组
- 借鉴快速排序的思想,实现算法将整型数组a[0...n]分成两块,使得第一块元素均大于等于0,第二块的元素均小于0,要求算法原地工作且时间复杂度为O(n)
- 【左神算法课】子数组最大差值小于某阈值,求满足条件的子数组个数
- 算法题27 在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
- 整型数组处理算法(四)求数组的最大值和最小值