窗口内最大值与最小值的更新结构

Ps: 实现一个窗口内的最大值与最小值更新结构,使用双端队列。

这里以数组内有多少组两数之差小于特定的number为例。 

class Solution {
public: 
	int getNum(vector<int> arr, int num) {
		if (arr.size() == 0) return 0;
		// 使用双端队列
		deque<int> dq_min;
		deque<int> dq_max; 
		int i = 0;
		int j = 0;
		int res = 0;
		while (i < arr.size()) {
			while (j < arr.size()) {
				// 窗口最小值更新结构
				while (!dq_min.empty() && dq_min.back() >= arr[i]) {
					dq_min.pop_back();
				}
				dq_min.push_back(j); 
                                // 窗口最大值更新结构
				while (!dq_max.empty() && dq_max.back() <= arr[i]) {
					dq_max.pop_back();
				}
				dq_max.push_back(j);
				if (arr[dq_max.front()] - arr[dq_min.front()] > num) {
					break;
				}
				j++;
			}
			// 弹出结构
			if (dq_min.front() = i) {
				dq_min.pop_front(); 
			}
			if (dq_max.front() == i) {
				dq_max.pop_front(); 
			}
			res += j - i; // 窗口最大值- 窗口最小值 <= num , 窗口内更小于
			i++;
		}
		return res; 
	}                      

  

原文地址:https://www.cnblogs.com/E-Dreamer-Blogs/p/12287274.html