日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)

發布時間:2024/2/28 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 左神算法:最大值减去最小值小于或等于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版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。