Sliding window

 avatar
unknown
c_cpp
3 years ago
879 B
5
Indexable
class SlidingWindow {
private:
	const std::vector<int>& vector_;

	std::deque<int> min_deque_;
	
	size_t left_border_ = 0, right_border_;

public:
	SlidingWindow(const std::vector<int>& vector, size_t window_size)
	: vector_(vector)
	, right_border_(window_size) {
		for (size_t i = 0; i < window_size; ++i) {
			while (!min_deque_.empty() && min_deque_.back() < vector[i])
				min_deque_.pop_back();
			min_deque_.push_back(vector[i]);
		}
	}

	void MoveRight() {
		if (vector_[left_border_] == min_deque_.front())
			min_deque_.pop_front();

		if (right_border_ < vector_.size()) {
			while (!min_deque_.empty() && min_deque_.back() < vector_[right_border_])
				min_deque_.pop_back();
			min_deque_.push_back(vector_[right_border_]);
		}

		++left_border_; ++right_border_;
	}

	inline int GetMin() const {
		return min_deque_.front();
	}
};
Editor is loading...