zoukankan      html  css  js  c++  java
  • 窗口内最大值与最小值的更新结构

    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; 
    	}                      
    

      

  • 相关阅读:
    街边的泥人张
    没事试试50mm1.4
    WWOOF介绍一下,但貌似我们利用不了
    护照和签证
    071205还是晴photo
    忘年旅行
    12月6日大雪
    12月5日
    周六
    071204 晴
  • 原文地址:https://www.cnblogs.com/E-Dreamer-Blogs/p/12287274.html
Copyright © 2011-2022 走看看