左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)
生活随笔
收集整理的這篇文章主要介紹了
左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本題來自左神《程序員面試代碼指南》“最大值減去最小值小于或等于num的子數組的數量”題目。
題目
給定數組 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 和 num,其中 n 表示數組 arr 的長度
第二行輸入n個整數X_i,表示數組arr中的每個元素
5 2
1 2 3 4 5
輸出
輸出給定數組中滿足條件的子數組個數
12
分析
本題用到的 雙端隊列 結構,可參考博客:左神算法:生成窗口最大值數組(Java版)
(過程草稿)
代碼
import java.util.*;// 最大值減最小值小于或等于num的子數組的數量 public class Main {public static int getNum(int[] arr, int num) {if (arr == null || arr.length == 0) {return 0;}LinkedList<Integer> qmax = new LinkedList<>();LinkedList<Integer> qmin = new LinkedList<>();int L = 0;int R = 0;int res = 0;while (L < arr.length) {while (R < arr.length) {// 生成最大值更新結構while (!qmax.isEmpty() && arr[R] >= arr[qmax.peekLast()]) {qmax.pollLast();}qmax.offerLast(R);// 生成最小值更新結構while (!qmin.isEmpty() && arr[R] <= arr[qmin.peekLast()]) {qmin.pollLast();}qmin.offerLast(R);if (arr[qmax.peekFirst()] - arr[qmin.peekFirst()] > num) {break;}R++;}// L所指向的元素將過期,需從更新結構中彈出if (qmax.peekFirst() == L) {qmax.pollFirst();}if (qmin.peekFirst() == L) {qmin.pollFirst();}// 統計子數組數量res += R - L;L++;}return res;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int num = sc.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = sc.nextInt();}System.out.println(getNum(arr, num));}}總結
以上是生活随笔為你收集整理的左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 左神算法:求最大子矩阵的大小(Java版
- 下一篇: 左神算法:可见的山峰对数量(有重复值的情