最大值减去最小值小于或等于num的子数组数量
2017-08-30 19:37
211 查看
题目
给定数组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)的解法解析
本题来自左神《IT名企算法与数据结构题目最优解》,下面是左神的实现过程与算法思路1、生成两个双端队列qmax 和qmin.
2、令j不断向右移动(j++),表示arr[i..j]一直向右扩大,并不断更新qmax和qmin结构,保证qmax和qmin始终维持动态窗口最大值和最小值的更新结构。
3、当进行完步骤2,令i向右移动一个位置并对qmax和qmin做出相应的更新做出相应的更新。
4、根据步骤2,步骤3,依次求出以arr[0],arr[1],arr[2]…..、arr[N-1] 作为第一个元素的子数组中满足条件的数量分别有多少,累加起来起来的数量就是最终的结果。
具体情况可以查看左神的这本书~解题很精
java代码实现如下
package com.gcp.www; import java.util.Deque; import java.util.LinkedList; /** * 最大值减去最小值小于或等于num的子数组数量 * @author chaplinJ * */ public class SuitSubArray { public int getNum(int[] arr,int num){ if(arr == null || arr.length == 0){ return 0; } int res = 0; int i = 0; int j = 0; Deque<Integer> qmax = new LinkedList<>(); Deque<Integer> qmin = new LinkedList<>(); while(i < arr.length){ while( j < arr.length){ //维护窗口最大值 while(!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[j]){ qmax.pollLast(); } qmax.addLast(j); //维护窗口最小值 while(!qmin.isEmpty() && arr[qmin.peekLast()] >= arr[j]){ qmin.pollLast(); } qmin.addLast(j); if(arr[qmax.peekFirst()] - arr[qmin.peekFirst()] > num){ break; } j++; } res += j - i; if(qmax.peekFirst() == i){ qmax.poll(); } if(qmin.peekFirst() == i){ qmin.poll(); } i++; } return res; } public static void main(String[] args) { int a[] = {1,2,3}; int result = new SuitSubArray().getNum(a, 4); System.out.println(result); } }
本题及题解来自左程云《IT名企算法与数据结构题目最优解》
相关文章推荐
- 数据结构 最大值减去最小值小于或等于num的子数组数量
- 最大值减去最小值小于或等于num的子数组数量
- 最大值减去最小值小于或等于num的子数组数量
- 算法题-最大值减去最小值小于或等于 num 的子数组数量
- 左神的书——《程序员代码面试指南》之最大值减去最小值小于或等于num的子数组的数量 c++实现
- 1.10 最大值减去最小值小于或等于num的子数组数量
- 栈和队列---最大值减去最小值小于或等于num的子数组数量
- 算法题-最大值减去最小值小于或等于 num 的子数组数量
- 最大值减去最小值小于等于num的子数组数量
- 子数组系列二:最大值减去最小值小于或等于 k 的子数组数量
- Codeing Interview: 最大值减去最小值小于或者等于num的子数组数量
- 最大值减去最小值小于或者等于num的子数组数量
- 最大值减去最小值小于或者等于num的子数组数量
- 【算法】最大值和最小值的差小于或者等于num的子数组数量
- 栈和队列(8)-- 最大值减去最小值小于或者等于num的子数组
- 滑动窗口变形题-最大值减去最小值小于等于num的子数组
- 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
- Js获取数组最大和最小值示例代码
- 判断一个数组(有n个数据,数组的值大于等于1小于等于N)里面是否有两个一样的数据
- 数组中最大最小值的蛮力法和二分法求解