Given an integer array nums and a window size k (sometimes denoted w), return an array containing the minimum value in every contiguous subarray (window) of size k as the window slides from left to right. If k > len(nums), return an empty list.
classSolution {
public: vector<int> slidingWindowMin(const vector<int>& nums, int k) {
int n = nums.size();
vector<int> ans;
if (k > n) return ans;
for (int i =0; i <= n - k; ++i) {
int mn = nums[i];
for (int j = i +1; j < i + k; ++j) mn = std::min(mn, nums[j]);
ans.push_back(mn);
}
return ans;
}
};
classSolution {
publicint[]slidingWindowMin(int[] nums, int k) {
int n = nums.length;
if (k > n) returnnewint[0];
int[] ans =newint[n - k + 1];
int idx = 0;
for (int i = 0; i <= n - k; i++) {
int mn = nums[i];
for (int j = i + 1; j < i + k; j++) mn = Math.min(mn, nums[j]);
ans[idx++]= mn;
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
classSolution:
defsliding_window_min(self, nums: list[int], k: int) -> list[int]:
n = len(nums)
if k > n:
return []
ans: list[int] = []
for i in range(0, n - k +1):
mn = nums[i]
for j in range(i+1, i+k):
if nums[j] < mn:
mn = nums[j]
ans.append(mn)
return ans
Divide the array into blocks of size k and precompute minima from left and right within each block. For any window starting at i, the minimum is min(rightMin[i], leftMin[i+k-1]).
classSolution {
public: vector<int> slidingWindowMinDP(const vector<int>& nums, int k) {
int n = nums.size();
vector<int> ans;
if (k > n) return ans;
vector<int> left(n), right(n);
for (int i =0; i < n; ++i) {
if (i % k ==0) left[i] = nums[i];
else left[i] = std::min(left[i-1], nums[i]);
}
for (int j = n -1; j >=0; --j) {
if (j == n -1|| (j +1) % k ==0) right[j] = nums[j];
else right[j] = std::min(right[j+1], nums[j]);
}
for (int i =0; i + k <= n; ++i) ans.push_back(std::min(right[i], left[i + k -1]));
return ans;
}
};
classSolution {
publicint[]slidingWindowMinDP(int[] nums, int k) {
int n = nums.length;
if (k > n) returnnewint[0];
int[] left =newint[n];
int[] right =newint[n];
for (int i = 0; i < n; i++) {
if (i % k == 0) left[i]= nums[i];
else left[i]= Math.min(left[i-1], nums[i]);
}
for (int j = n-1; j >= 0; j--) {
if (j == n-1 || (j+1) % k == 0) right[j]= nums[j];
else right[j]= Math.min(right[j+1], nums[j]);
}
int[] ans =newint[n - k + 1];
int idx = 0;
for (int i = 0; i + k <= n; i++) ans[idx++]= Math.min(right[i], left[i + k - 1]);
return ans;
}
}
classSolution:
defsliding_window_min_dp(self, nums: list[int], k: int) -> list[int]:
n = len(nums)
if k > n:
return []
left = [0] * n
right = [0] * n
for i in range(n):
if i % k ==0:
left[i] = nums[i]
else:
left[i] = min(left[i-1], nums[i])
for j in range(n-1, -1, -1):
if j == n-1or (j+1) % k ==0:
right[j] = nums[j]
else:
right[j] = min(right[j+1], nums[j])
ans: list[int] = []
for i in range(0, n - k +1):
ans.append(min(right[i], left[i + k -1]))
return ans
Maintain a deque of indices whose corresponding values are in non-decreasing order. The front of the deque holds the index of the minimum in the current window.
#include<deque>classSolution {
public: vector<int> slidingWindowMinDeque(const vector<int>& nums, int k) {
int n = nums.size();
vector<int> ans;
if (k > n) return ans;
deque<int> dq; // indices of potential minima
for (int r =0; r < n; ++r) {
while (!dq.empty() && nums[r] <= nums[dq.back()]) dq.pop_back();
dq.push_back(r);
if (dq.front() < r - k +1) dq.pop_front();
if (r >= k -1) ans.push_back(nums[dq.front()]);
}
return ans;
}
};
import java.util.ArrayDeque;
import java.util.Deque;
classSolution {
publicint[]slidingWindowMinDeque(int[] nums, int k) {
int n = nums.length;
if (k > n) returnnewint[0];
int[] ans =newint[n - k + 1];
Deque<Integer> dq =new ArrayDeque<>();
int idx = 0;
for (int r = 0; r < n; r++) {
while (!dq.isEmpty() && nums[r]<= nums[dq.peekLast()]) dq.removeLast();
dq.addLast(r);
if (dq.peekFirst() < r - k + 1) dq.removeFirst();
if (r >= k - 1) ans[idx++]= nums[dq.peekFirst()];
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from collections import deque
classSolution:
defsliding_window_min_deque(self, nums: list[int], k: int) -> list[int]:
n = len(nums)
if k > n:
return []
ans: list[int] = []
dq: deque[int] = deque()
for r in range(n):
while dq and nums[r] <= nums[dq[-1]]:
dq.pop()
dq.append(r)
if dq[0] < r - k +1:
dq.popleft()
if r >= k -1:
ans.append(nums[dq[0]])
return ans