1. 程式人生 > >最大值減去最小值小於或等於num的子陣列數量

最大值減去最小值小於或等於num的子陣列數量

題目

給定陣列arr和整數num,共返回有多少個子陣列滿足如下情況:
max(arr[i…j]) - min(arr[i…j]) <= num
mar(arr[i…j])表示陣列arr[i…j]中的最大值,min(arr[i…j])表示子陣列arr[i…j]中的最小值。

要求

如果陣列長度為N,請事先時間複雜度為*O(N)*的解法。
具體思路請參考書籍

程式碼

#include<iostream>
#include<stack>
using namespace std;

int getNum(int* arr, int len, int
num) { if (arr == NULL || len == 0) return 0; deque<int>qmin; deque<int>qmax; int i = 0; int j = 0; int res = 0; while (i < len) { while (j < len) { while (!qmin.empty() && arr[qmin.back()] >= arr[j]) qmin.pop_back(); qmin.push_back(j); while (!qmax.
empty() && arr[qmax.back()] <= arr[j]) qmax.pop_back(); qmax.push_back(j); if (arr[qmax.front()] - arr[qmin.front()] > num) break; j++; } if (qmin.front() == i) qmin.pop_front(); if (qmax.front() == i) qmax.pop_front(); res += j - i; i++; } return res;
} int main() { /*int input[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9}; int num = 4; int len = 9;*/ int input[] = { 1, 2, 3 }; int num = 1; int len = 3; int fRes = getNum(input, len, num); cout << fRes << endl; getchar(); return 0; }