E-Dreamer-Blogs

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

  

分类:

技术点:

相关文章:

  • 2020-03-17
  • 2019-07-31
  • 2021-09-19
  • 2021-08-21
  • 2021-08-07
  • 2021-10-17
  • 2021-08-21
  • 2021-08-21
猜你喜欢
  • 2021-09-19
  • 2021-11-02
  • 2021-09-19
  • 2021-06-28
  • 2021-12-29
  • 2021-06-26
  • 2021-07-21
相关资源
相似解决方案